From 777b7490470c9f1328abe8d0f83bedda8f02593d Mon Sep 17 00:00:00 2001 From: Claudius Holeksa Date: Thu, 15 Jun 2023 20:45:27 +0200 Subject: c++, codec-json: Added multi dimensional arrays to json --- src/codec-json/json.tmpl.h | 59 +++++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 22 deletions(-) (limited to 'src/codec-json/json.tmpl.h') diff --git a/src/codec-json/json.tmpl.h b/src/codec-json/json.tmpl.h index 0d1c7f0..f5788e7 100644 --- a/src/codec-json/json.tmpl.h +++ b/src/codec-json/json.tmpl.h @@ -120,36 +120,51 @@ struct json_encode, RootSchema, FromEncode> { } }; -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; +template +struct json_encode, RootSchema, FromEncode> { + template + static error_or encode_level(const data, FromEncode>& from, buffer& to, std::array& index){ + if constexpr (Level == D){ + auto eov = json_encode::encode(from.at(index), to); + if(eov.is_error()){ + return eov; } - } - 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; + } else { + { + auto err = to.push('['); + if(!err.template is_type()){ + return err; } } - auto eov = json_encode::encode(from.at(i), to); - if(eov.is_error()){ - return eov; + for(std::size_t i = 0; i < from.get_dim_size(Level); ++i){ + if( i > 0 ){ + auto err = to.push(','); + if(!err.template is_type()){ + return err; + } + } + { + index[Level] = i; + auto eov = encode_level(from, to, index); + if(eov.is_error()){ + return eov; + } + } } - } - { - auto err = to.push(']'); - if(!err.template is_type()){ - return err; + { + auto err = to.push(']'); + if(!err.template is_type()){ + return err; + } } } - return void_t{}; } + + static error_or encode(const data, FromEncode>& from, buffer& to) { + std::array index; + return encode_level<0>(from, to, index); + } }; template -- cgit v1.2.3