#pragma once #include #include #include #include namespace saw { namespace encode { struct Json { static constexpr string_literal name = "encode::Json"; }; } template class data { private: own buffer_; public: data():buffer_{heap()}{} data(own buffer__):buffer_{std::move(buffer__)}{} data(std::size_t ring_size_):buffer_{heap(ring_size_)}{} data(const std::string_view& view__): buffer_{heap(view__.size())} { auto ptr = reinterpret_cast(view__.data()); if(!ptr){ return; } buffer_->push(*ptr, view__.size()); } buffer& get_buffer(){ return *buffer_; } const buffer& get_buffer() const { return *buffer_; } error push(uint8_t val){ return buffer_->push(val); } std::size_t get_size() const { return buffer_->read_composite_length(); } uint8_t& at(std::size_t i){ return buffer_->read(i); } const uint8_t& at(std::size_t i) const { return buffer_->read(i); } }; template struct codec_config; template<> struct codec_config { uint64_t depth = 16u; uint64_t length = 4096u; bool pretty = false; bool is_within(uint64_t bytes, uint64_t d){ return bytes <= length && d <= depth; } }; } #include "json.tmpl.hpp" namespace saw { /** * Codec class for json */ template class codec { private: codec_config cfg_; public: /** * Default constructor */ codec(){} /** * Constructor */ codec(const codec_config& cfg__):cfg_{cfg__}{} SAW_FORBID_COPY(codec); SAW_DEFAULT_MOVE(codec); template error_or encode(const data& from_encode, data& to_encode){ // To Be encoded buffer_view buff_v{to_encode.get_buffer()}; auto eov = impl::json_encode::encode(from_encode, buff_v, 0, cfg_.pretty); if(eov.is_error()){ return std::move(eov.get_error()); } to_encode.get_buffer().write_advance(buff_v.write_offset()); return void_t{}; } template error_or decode(data& from_decode, data& to_decode){ buffer_view buff_v{from_decode.get_buffer()}; impl::json_helper::skip_whitespace(buff_v); auto eov = impl::json_decode::decode(buff_v, to_decode); if(eov.is_error()){ return std::move(eov.get_error()); } from_decode.get_buffer().read_advance(buff_v.read_offset()); return void_t {}; } }; }