#ifndef JSON_HPP #define JSON_HPP #include #include #include namespace JsonParser { void init(); void add_text(const uint8_t* buf, size_t size); // int json_printer(const char* bytes, size_t len, void* data); class HandlerBase { public: /* private but accessible from static functions */ HandlerBase* _next; HandlerBase(); virtual bool handle(const char* buf, size_t size) = 0; }; template class Handler: public HandlerBase { const Struct& _s; const json_obj_descr* _da; Fct _fct; bool _allow_partial; const int64_t _all_fields; public: Handler( Struct default_s, const json_obj_descr (&da)[DESC_SIZE], Fct fct, bool allow_partial = false): _s {default_s}, _da {da}, _fct {fct}, _allow_partial {allow_partial}, _all_fields {(1 << DESC_SIZE) - 1} {} // void print(const Struct& s) // { // json_obj_encode(_da, DESC_SIZE, &s, json_printer, NULL); // } bool handle(const char* buf, size_t size) override { Struct s {_s}; int64_t ret = json_obj_parse((char*)buf, size, _da, DESC_SIZE, &s); if (ret <= 0) { return false; } if (ret != _all_fields && !_allow_partial) { return false; } if (!_fct(s, ret, _all_fields)) { return false; } // LOG_DBG"received a valid json\n"); // print(s); // LOG_INF"\n"); return true; } }; } // namespace JsonParser #endif /* JSON_HPP */