From 85398a9410a3ab36786c1e436986309ee6163f2f Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Sun, 11 Jun 2023 20:20:52 +0200 Subject: c++, codec-json: Added struct to json encoding and fixed a buffer bug on the fly --- src/codec-json/json.tmpl.h | 108 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) (limited to 'src/codec-json') diff --git a/src/codec-json/json.tmpl.h b/src/codec-json/json.tmpl.h index 0738277..38959b2 100644 --- a/src/codec-json/json.tmpl.h +++ b/src/codec-json/json.tmpl.h @@ -119,5 +119,113 @@ struct json_encode, RootSchema, FromEncode> { return void_t{}; } }; + +template +struct json_encode, RootSchema, FromEncode> { + static error_or encode(const data, FromEncode>& from, buffer& to) { + { + auto err = to.push('['); + if(!err.template is_type()){ + return err; + } + } + for(std::size_t i = 0; i < from.size(); ++i){ + if(i > 0){ + auto eov_ele = to.push(','); + if(!eov_ele.template is_type()){ + return eov_ele; + } + } + auto eov = json_encode::encode(from.at(i), to); + if(eov.is_error()){ + return eov; + } + } + { + auto err = to.push(']'); + if(!err.template is_type()){ + return err; + } + } + + return void_t{}; + } +}; + +template +struct json_encode...>, RootSchema, FromEncode> { + + template + static error_or encode_element(const data...>, FromEncode>& from, buffer& to){ + // Encode the name + { + std::string_view view = parameter_key_pack_type::literal.view(); + error err = to.push('"'); + if(!err.template is_type()){ + return err; + } + err = to.push(*reinterpret_cast(view.data()), view.size()); + if(!err.template is_type()){ + return err; + } + err = to.push('"'); + if(!err.template is_type()){ + return err; + } + } + // Add the separator + { + auto eov_ele = to.push(':'); + if(!eov_ele.template is_type()){ + return eov_ele; + } + } + + // Encode the value + auto eov = json_encode::type, RootSchema, FromEncode>::encode(from.template get::literal>(), to); + + // Go to the next element + if constexpr ( (i+1) < sizeof...(T)){ + { + auto eov_ele = to.push(','); + if(!eov_ele.template is_type()){ + return eov_ele; + } + } + { + auto eov_ele = encode_element(from, to); + if(eov_ele.is_error()){ + return eov_ele; + } + } + + + } + + return void_t{}; + } + static error_or encode(const data...>, FromEncode>& from, buffer& to) { + { + auto err = to.push('{'); + if(!err.template is_type()){ + return err; + } + } + if constexpr ( sizeof...(T) > 0 ){ + auto eov = encode_element<0>(from, to); + if(eov.is_error()){ + return eov; + } + } + { + auto err = to.push('}'); + if(!err.template is_type()){ + return err; + } + } + + return void_t{}; + } +}; } } -- cgit v1.2.3