| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- /*
- ** 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_ */
|