Files
zephyr_json_cpp/include/json.hpp
Mickael Bosch b11692a77c rm debug output
2026-07-01 10:13:07 +02:00

80 lines
1.7 KiB
C++

#ifndef JSON_HPP
#define JSON_HPP
#include <stddef.h>
#include <stdint.h>
#include <zephyr/data/json.h>
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 <typename Struct, size_t DESC_SIZE, typename Fct>
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 */