diff options
Diffstat (limited to 'src/codec-json/json.tmpl.h')
-rw-r--r-- | src/codec-json/json.tmpl.h | 59 |
1 files changed, 37 insertions, 22 deletions
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<schema::Tuple<T...>, RootSchema, FromEncode> { } }; -template<typename T, typename RootSchema, typename FromEncode> -struct json_encode<schema::Array<T>, RootSchema, FromEncode> { - static error_or<void> encode(const data<schema::Array<T>, FromEncode>& from, buffer& to) { - { - auto err = to.push('['); - if(!err.template is_type<err::no_error>()){ - return err; +template<typename T, size_t D, typename RootSchema, typename FromEncode> +struct json_encode<schema::Array<T,D>, RootSchema, FromEncode> { + template<size_t Level> + static error_or<void> encode_level(const data<schema::Array<T,D>, FromEncode>& from, buffer& to, std::array<std::size_t, D>& index){ + if constexpr (Level == D){ + auto eov = json_encode<T, RootSchema, FromEncode>::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<err::no_error>()){ - return eov_ele; + } else { + { + auto err = to.push('['); + if(!err.template is_type<err::no_error>()){ + return err; } } - auto eov = json_encode<T, RootSchema, FromEncode>::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<err::no_error>()){ + return err; + } + } + { + index[Level] = i; + auto eov = encode_level<Level+1>(from, to, index); + if(eov.is_error()){ + return eov; + } + } } - } - { - auto err = to.push(']'); - if(!err.template is_type<err::no_error>()){ - return err; + { + auto err = to.push(']'); + if(!err.template is_type<err::no_error>()){ + return err; + } } } - return void_t{}; } + + static error_or<void> encode(const data<schema::Array<T,D>, FromEncode>& from, buffer& to) { + std::array<std::size_t, D> index; + return encode_level<0>(from, to, index); + } }; template<typename... T, string_literal... Key, typename RootSchema, typename FromEncode> |