diff options
author | Claudius "keldu" Holeksa <mail@keldu.de> | 2024-01-23 22:32:53 +0100 |
---|---|---|
committer | Claudius "keldu" Holeksa <mail@keldu.de> | 2024-01-23 22:33:10 +0100 |
commit | 71dc83782d1b529c1adb468fe3e095e28323e66a (patch) | |
tree | 560822610f929af91fc34a58a05f3ebb5b69120c /modules/codec-json | |
parent | 80132c8e221aa5a922496c46e23432685885ba04 (diff) |
codec-json: Adding FixedArray encoding
Diffstat (limited to 'modules/codec-json')
-rw-r--r-- | modules/codec-json/c++/json.tmpl.hpp | 60 |
1 files changed, 60 insertions, 0 deletions
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<schema::Array<T,D>, RootSchema, FromEncode> { } }; +template<typename T, size_t... D, typename RootSchema, typename FromEncode> +struct json_encode<schema::FixedArray<T,D...>, RootSchema, FromEncode> { + using Schema = schema::FixedArray<T,D...>; + + static error_or<void> encode_at(const data<Schema, FromEncode>& from, buffer& to, std::array<std::size_t, sizeof...(D)>& index){ + auto eov = json_encode<T, RootSchema, FromEncode>::encode(from.at(index), to); + if(eov.is_error()){ + return eov; + } + return void_t{}; + } + + template<size_t Level, size_t Dim, size_t... DimPack> + static error_or<void> encode_level(const data<Schema, FromEncode>& from, buffer& to, std::array<std::size_t, sizeof...(D)>& index){ + { + auto err = to.push('['); + if(!err.template is_type<err::no_error>()){ + return err; + } + } + for(std::size_t i = 0; i < Dim; ++i){ + if( i > 0 ){ + auto err = to.push(','); + if(!err.template is_type<err::no_error>()){ + return err; + } + } + { + index[Level] = i; + if constexpr (sizeof...(DimPack) > 0){ + auto eov = encode_level<Level+1, DimPack...>(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<err::no_error>()){ + return err; + } + } + return void_t{}; + } + + static error_or<void> encode(const data<Schema, FromEncode>& from, buffer& to) { + if constexpr (sizeof...(D) > 0){ + std::array<std::size_t, sizeof...(D)> index; + return encode_level<D...>(from, to, index); + } + return void_t{}; + } +}; + template<typename... T, string_literal... Key, typename RootSchema, typename FromEncode> struct json_encode<schema::Struct<schema::Member<T,Key>...>, RootSchema, FromEncode> { |