From 71dc83782d1b529c1adb468fe3e095e28323e66a Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Tue, 23 Jan 2024 22:32:53 +0100 Subject: codec-json: Adding FixedArray encoding --- modules/codec-json/c++/json.tmpl.hpp | 60 ++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'modules/codec-json/c++') diff --git a/modules/codec-json/c++/json.tmpl.hpp b/modules/codec-json/c++/json.tmpl.hpp index 84f0058..c757fc6 100644 --- a/modules/codec-json/c++/json.tmpl.hpp +++ b/modules/codec-json/c++/json.tmpl.hpp @@ -169,6 +169,66 @@ struct json_encode, RootSchema, FromEncode> { } }; +template +struct json_encode, RootSchema, FromEncode> { + using Schema = schema::FixedArray; + + static error_or encode_at(const data& from, buffer& to, std::array& index){ + auto eov = json_encode::encode(from.at(index), to); + if(eov.is_error()){ + return eov; + } + return void_t{}; + } + + template + static error_or encode_level(const data& from, buffer& to, std::array& index){ + { + auto err = to.push('['); + if(!err.template is_type()){ + return err; + } + } + for(std::size_t i = 0; i < Dim; ++i){ + if( i > 0 ){ + auto err = to.push(','); + if(!err.template is_type()){ + return err; + } + } + { + index[Level] = i; + if constexpr (sizeof...(DimPack) > 0){ + auto eov = encode_level(from, to, index); + if(eov.is_error()){ + return eov; + } + }else{ + auto eov = encode_at(from,to,index); + if(eov.is_error()){ + return eov; + } + } + } + } + { + auto err = to.push(']'); + if(!err.template is_type()){ + return err; + } + } + return void_t{}; + } + + static error_or encode(const data& from, buffer& to) { + if constexpr (sizeof...(D) > 0){ + std::array index; + return encode_level(from, to, index); + } + return void_t{}; + } +}; + template struct json_encode...>, RootSchema, FromEncode> { -- cgit v1.2.3