blob: d323c52ef8c550639e22b2fe0934db917a5186d3 [file] [log] [blame]
/*
** 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_ */