summaryrefslogtreecommitdiff
path: root/modules/codec-json
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2024-01-23 22:32:53 +0100
committerClaudius "keldu" Holeksa <mail@keldu.de>2024-01-23 22:33:10 +0100
commit71dc83782d1b529c1adb468fe3e095e28323e66a (patch)
tree560822610f929af91fc34a58a05f3ebb5b69120c /modules/codec-json
parent80132c8e221aa5a922496c46e23432685885ba04 (diff)
codec-json: Adding FixedArray encoding
Diffstat (limited to 'modules/codec-json')
-rw-r--r--modules/codec-json/c++/json.tmpl.hpp60
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> {