diff options
Diffstat (limited to 'src/codec-json/json.tmpl.h')
-rw-r--r-- | src/codec-json/json.tmpl.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/codec-json/json.tmpl.h b/src/codec-json/json.tmpl.h index 38959b2..0d1c7f0 100644 --- a/src/codec-json/json.tmpl.h +++ b/src/codec-json/json.tmpl.h @@ -227,5 +227,81 @@ struct json_encode<schema::Struct<schema::Member<T,Key>...>, RootSchema, FromEnc return void_t{}; } }; + +template<typename... T, string_literal... Key, typename RootSchema, typename FromEncode> +struct json_encode<schema::Union<schema::Member<T,Key>...>, RootSchema, FromEncode> { + + template<size_t i> + static error_or<void> encode_element(const data<schema::Union<schema::Member<T,Key>...>, FromEncode>& from, buffer& to){ + if(from.template holds_alternative<typename parameter_key_pack_type<i, Key...>::literal>()){ + // Encode the name + { + std::string_view view = parameter_key_pack_type<i, Key...>::literal.view(); + error err = to.push('"'); + if(!err.template is_type<err::no_error>()){ + return err; + } + err = to.push(*reinterpret_cast<const uint8_t *>(view.data()), view.size()); + if(!err.template is_type<err::no_error>()){ + return err; + } + err = to.push('"'); + if(!err.template is_type<err::no_error>()){ + return err; + } + } + // Add the separator + { + auto eov_ele = to.push(':'); + if(!eov_ele.template is_type<err::no_error>()){ + return eov_ele; + } + } + + // Encode the value + auto eov = json_encode<typename parameter_pack_type<i, T...>::type, RootSchema, FromEncode>::encode(from.template get<parameter_key_pack_type<i, Key...>::literal>(), to); + } + // Go to the next element + if constexpr ( (i+1) < sizeof...(T)){ + { + auto eov_ele = encode_element<i+1>(from, to); + if(eov_ele.is_error()){ + return eov_ele; + } + } + + + } + + return void_t{}; + } + static error_or<void> encode(const data<schema::Union<schema::Member<T,Key>...>, FromEncode>& from, buffer& to) { + { + auto err = to.push('{'); + if(!err.template is_type<err::no_error>()){ + return err; + } + } + if constexpr ( sizeof...(T) > 0 ){ + auto eov = encode_element<0>(from, to); + if(eov.is_error()){ + return eov; + } + } + { + auto err = to.push('}'); + if(!err.template is_type<err::no_error>()){ + return err; + } + } + + return void_t{}; + } +}; + +template<typename Schema, typename RootSchema, typename ToDecode> +struct json_decode; + + } } |