diff options
Diffstat (limited to 'src/codec-json/json.tmpl.h')
-rw-r--r-- | src/codec-json/json.tmpl.h | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/codec-json/json.tmpl.h b/src/codec-json/json.tmpl.h index d29f29c..3699e10 100644 --- a/src/codec-json/json.tmpl.h +++ b/src/codec-json/json.tmpl.h @@ -9,11 +9,31 @@ class json_encode_impl { static_assert(always_false<Schema, RootSchema, FromEncode>, "This schema type is not being handle by the json encoding."); }; -template<size_t N, typename RootSchema, typename FromEncode> -class json_encode_impl<saw::schema::Primitive<schema::FloatingPoint,N>, RootSchema, FromEncode> { +template<typename T, size_t N, typename RootSchema, typename FromEncode> +class json_encode_impl<saw::schema::Primitive<T,N>, RootSchema, FromEncode> { static ErrorOr<void> encode(const data<Schema, FromEncode>& from, data<Schema, encode::Json>& to, size_t ptr) { auto val = from.get(); - auto tc_result = std::to_chars(); + std::array<uint8_t, 256> data; + auto tc_result = std::to_chars(reinterpret_cast<int8_t>(data.data()), reinrepret_cast<int8_t>(data.data())+data.size(), val); + + if(tc_result.ec != std::errc{}){ + return make_error<err::critical>(); + } + + size_t bytes_written = 0; + for(auto ptr = data.data(); ptr != tc_result.ptr; ++ptr){ + ++bytes_written; + } + + auto& buff = to.get_buffer(); + error err = buff.write_require_length(bytes_written); + if(!err.template is_type<err::no_error>()){ + return std::move(err); + } + + for(auto ptr = data.data(); ptr != tc_result.ptr; ++ptr){ + buff.push(ptr[0]); + } return Void{}; } |