diff options
Diffstat (limited to 'src/codec-json/json.tmpl.h')
-rw-r--r-- | src/codec-json/json.tmpl.h | 134 |
1 files changed, 81 insertions, 53 deletions
diff --git a/src/codec-json/json.tmpl.h b/src/codec-json/json.tmpl.h index b8cd7aa..0f6c59f 100644 --- a/src/codec-json/json.tmpl.h +++ b/src/codec-json/json.tmpl.h @@ -10,7 +10,7 @@ class json_encode { }; template<typename T, size_t N, typename RootSchema, typename FromEncode> -struct json_encode<schema::Primitive<T,N>, RootSchema, FromEncode> { +struct json_encode<schema::Primitive<T,N>, RootSchema, FromEncode> { static error_or<void> encode(const data<schema::Primitive<T,N>, FromEncode>& from, buffer& to) { auto val = from.get(); std::array<uint8_t, 256> data; @@ -38,58 +38,6 @@ struct json_encode<schema::Primitive<T,N>, RootSchema, FromEncode> { return void_t{}; } - - static error_or<void> decode(buffer_view& buff, data<schema::Primitive<T,N>, FromEncode>& to){ - assert((buff.read() >= '0' && buff.read() <= '9') || - buff.read() == '+' || buff.read() == '-'); - - std::size_t offset = 0; - - if(buff.read() == '-'){ - ++offset; - }else if(buff.read() == '+'){ - return make_error<err::not_supported>(); - } - if (offset >= buff.read_composite_length()) { - return make_error<err::buffer_exhausted>(); - } - if(buff.read(offset) >= '1' && buff.read(offset) <= '9'){ - ++offset; - - if(offset >= buff.read_composite_length()){ - return make_error<err::buffer_exhausted>(); - } - - while(1){ - if (buff.read(offset) >= '0' && buff.read(offset) <= '9'){ - ++offset; - - if(offset >= buff.read_composite_length()){ - return make_error<err::buffer_exhausted>(); - } - continue; - } - break; - } - }else if (buff.read(offset) == '0' ){ - ++offset; - }else{ - return make_error<err::buffer_exhausted>(); - } - - { - std::string_view num_view{reinterpret_cast<char*>(&buff.read()), offset}; - typename native_data_type<schema::Primitive<T,N>>::type result; - auto fc_result = std::from_chars(num_view.data(), num_view.data() + num_view.size(), result); - if(fc_result.ec != std::errc{}){ - return make_error<err::invalid_state>(); - } - - to.set(result); - } - - return void_t{}; - } }; template<typename RootSchema, typename FromEncode> @@ -369,6 +317,86 @@ struct json_encode<schema::Union<schema::Member<T,Key>...>, RootSchema, FromEnco template<typename Schema, typename RootSchema, typename ToDecode> struct json_decode; +template<typename T, size_t N, typename RootSchema, typename ToDecode> +struct json_decode<schema::Primitive<T,N>, RootSchema, ToDecode> { + static error_or<void> decode(buffer_view& buff, data<schema::Primitive<T,N>, ToDecode>& to){ + assert((buff.read() >= '0' && buff.read() <= '9') || + buff.read() == '+' || buff.read() == '-'); + + std::size_t offset = 0; + + if(buff.read() == '-'){ + ++offset; + }else if(buff.read() == '+'){ + return make_error<err::not_supported>(); + } + if (offset >= buff.read_composite_length()) { + return make_error<err::buffer_exhausted>(); + } + if(buff.read(offset) >= '1' && buff.read(offset) <= '9'){ + ++offset; + + if(offset >= buff.read_composite_length()){ + return make_error<err::buffer_exhausted>(); + } + while(1){ + if (buff.read(offset) >= '0' && buff.read(offset) <= '9'){ + ++offset; + + if(offset >= buff.read_composite_length()){ + break; + } + continue; + } + break; + } + }else if (buff.read(offset) == '0' ){ + ++offset; + }else{ + return make_error<err::buffer_exhausted>(); + } + + { + std::string_view num_view{reinterpret_cast<char*>(&buff.read()), offset}; + typename native_data_type<schema::Primitive<T,N>>::type result; + auto fc_result = std::from_chars(num_view.data(), num_view.data() + num_view.size(), result); + if(fc_result.ec != std::errc{}){ + return make_error<err::invalid_state>(); + } + + to.set(result); + } + buff.read_advance(offset); + + return void_t{}; + } +}; + +template<typename T, size_t D, typename RootSchema, typename ToDecode> +struct json_decode<schema::Array<T,D>, RootSchema, ToDecode> { + template<size_t Level> + static error_or<void> decode_level(buffer_view& buff, data<schema::Array<T,D>, ToDecode>& to, std::array<std::size_t, D>& index){ + if constexpr (Level == D) { + auto eov = json_decode<T, RootSchema, ToDecode>::decode(buff, to.at(index)); + if(eov.is_error()){ + return eov; + } + } else { + assert(buff.read() == '['); + buff.read_advance(1); + if( buff.read_composite_length() == 0 ){ + return make_error<err::buffer_exhausted>(); + } + + } + return void_t{}; + } + + static error_or<void> decode(buffer_view& buff, data<schema::Array<T,D>, ToDecode>& to){ + std::array<std::size_t, D> index; + return decode_level<0>(buff, to, index); + } +}; } } |