| /* |
| ** upb::json::Parser (upb_json_parser) |
| ** |
| ** Parses JSON according to a specific schema. |
| ** Support for parsing arbitrary JSON (schema-less) will be added later. |
| */ |
| |
| #ifndef UPB_JSON_PARSER_H_ |
| #define UPB_JSON_PARSER_H_ |
| |
| #include "upb/sink.h" |
| |
| #ifdef __cplusplus |
| namespace upb { |
| namespace json { |
| class CodeCache; |
| class ParserPtr; |
| class ParserMethodPtr; |
| } /* namespace json */ |
| } /* namespace upb */ |
| #endif |
| |
| /* upb_json_parsermethod ******************************************************/ |
| |
| struct upb_json_parsermethod; |
| typedef struct upb_json_parsermethod upb_json_parsermethod; |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| const upb_byteshandler* upb_json_parsermethod_inputhandler( |
| const upb_json_parsermethod* m); |
| |
| #ifdef __cplusplus |
| } /* extern "C" */ |
| |
| class upb::json::ParserMethodPtr { |
| public: |
| ParserMethodPtr() : ptr_(nullptr) {} |
| ParserMethodPtr(const upb_json_parsermethod* ptr) : ptr_(ptr) {} |
| |
| const upb_json_parsermethod* ptr() const { return ptr_; } |
| |
| const BytesHandler* input_handler() const { |
| return upb_json_parsermethod_inputhandler(ptr()); |
| } |
| |
| private: |
| const upb_json_parsermethod* ptr_; |
| }; |
| |
| #endif /* __cplusplus */ |
| |
| /* upb_json_parser ************************************************************/ |
| |
| /* Preallocation hint: parser won't allocate more bytes than this when first |
| * constructed. This hint may be an overestimate for some build configurations. |
| * But if the parser library is upgraded without recompiling the application, |
| * it may be an underestimate. */ |
| #define UPB_JSON_PARSER_SIZE 5712 |
| |
| struct upb_json_parser; |
| typedef struct upb_json_parser upb_json_parser; |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| upb_json_parser* upb_json_parser_create(upb_arena* a, |
| const upb_json_parsermethod* m, |
| const upb_symtab* symtab, |
| upb_sink output, |
| upb_status *status, |
| bool ignore_json_unknown); |
| upb_bytessink upb_json_parser_input(upb_json_parser* p); |
| |
| #ifdef __cplusplus |
| } /* extern "C" */ |
| |
| /* Parses an incoming BytesStream, pushing the results to the destination |
| * sink. */ |
| class upb::json::ParserPtr { |
| public: |
| ParserPtr(upb_json_parser* ptr) : ptr_(ptr) {} |
| |
| static ParserPtr Create(Arena* arena, ParserMethodPtr method, |
| SymbolTable* symtab, Sink output, Status* status, |
| bool ignore_json_unknown) { |
| upb_symtab* symtab_ptr = symtab ? symtab->ptr() : nullptr; |
| return ParserPtr(upb_json_parser_create( |
| arena->ptr(), method.ptr(), symtab_ptr, output.sink(), status->ptr(), |
| ignore_json_unknown)); |
| } |
| |
| BytesSink input() { return upb_json_parser_input(ptr_); } |
| |
| private: |
| upb_json_parser* ptr_; |
| }; |
| |
| #endif /* __cplusplus */ |
| |
| /* upb_json_codecache *********************************************************/ |
| |
| /* Lazily builds and caches decoder methods that will push data to the given |
| * handlers. The upb_symtab object(s) must outlive this object. */ |
| |
| struct upb_json_codecache; |
| typedef struct upb_json_codecache upb_json_codecache; |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| upb_json_codecache *upb_json_codecache_new(void); |
| void upb_json_codecache_free(upb_json_codecache *cache); |
| const upb_json_parsermethod* upb_json_codecache_get(upb_json_codecache* cache, |
| const upb_msgdef* md); |
| |
| #ifdef __cplusplus |
| } /* extern "C" */ |
| |
| class upb::json::CodeCache { |
| public: |
| CodeCache() : ptr_(upb_json_codecache_new(), upb_json_codecache_free) {} |
| |
| /* Returns a DecoderMethod that can push data to the given handlers. |
| * If a suitable method already exists, it will be returned from the cache. */ |
| ParserMethodPtr Get(MessageDefPtr md) { |
| return upb_json_codecache_get(ptr_.get(), md.ptr()); |
| } |
| |
| private: |
| std::unique_ptr<upb_json_codecache, decltype(&upb_json_codecache_free)> ptr_; |
| }; |
| |
| #endif |
| |
| #endif /* UPB_JSON_PARSER_H_ */ |