Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
3.9 KiB
140 lines
3.9 KiB
/* |
|
** 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 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_ */
|
|
|