From 17993ac2eb00d81fca19e0127d6795592c7b9fc1 Mon Sep 17 00:00:00 2001 From: "keldu.magnus" Date: Fri, 5 Mar 2021 13:06:40 +0100 Subject: [PATCH] json using write context --- source/json.h | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/source/json.h b/source/json.h index 3b6df5c..69e5629 100644 --- a/source/json.h +++ b/source/json.h @@ -27,7 +27,6 @@ private: struct WriteContext { public: Buffer &buffer; - const Limits &limits; size_t offset = 0; size_t depth = 0; @@ -57,10 +56,13 @@ private: /// @todo change the buffer interface to use an offset with /// default size_t offset = 0 } + + return noError(); } Error push(const uint8_t &value) { return push(value, 1); } }; + template friend class JsonEncodeImpl; struct ReadContext { public: @@ -125,7 +127,7 @@ template struct JsonEncodeImpl; template struct JsonEncodeImpl> { static Error encode(typename MessagePrimitive::Reader data, - Buffer &buffer) { + JsonCodec::WriteContext &buffer) { std::string stringified = std::to_string(data.get()); Error error = buffer.push(*reinterpret_cast(stringified.data()), @@ -139,7 +141,7 @@ template struct JsonEncodeImpl> { template <> struct JsonEncodeImpl> { static Error encode(typename MessagePrimitive::Reader data, - Buffer &buffer) { + JsonCodec::WriteContext &buffer) { std::string str = std::string{"\""} + std::string{data.get()} + std::string{"\""}; Error error = buffer.push( @@ -153,7 +155,7 @@ template <> struct JsonEncodeImpl> { template <> struct JsonEncodeImpl> { static Error encode(typename MessagePrimitive::Reader data, - Buffer &buffer) { + JsonCodec::WriteContext &buffer) { std::string str = data.get() ? "true" : "false"; Error error = buffer.push( *reinterpret_cast(str.data()), str.size()); @@ -167,7 +169,8 @@ template <> struct JsonEncodeImpl> { template struct JsonEncodeImpl> { template static typename std::enable_if::type - encodeMembers(typename MessageList::Reader data, Buffer &buffer) { + encodeMembers(typename MessageList::Reader data, + JsonCodec::WriteContext &buffer) { (void)data; (void)buffer; return noError(); @@ -175,7 +178,8 @@ template struct JsonEncodeImpl> { template static typename std::enable_if < i::type - encodeMembers(typename MessageList::Reader data, Buffer &buffer) { + encodeMembers(typename MessageList::Reader data, + JsonCodec::WriteContext &buffer) { if (data.template get().isSetExplicitly()) { { Error error = @@ -213,7 +217,7 @@ template struct JsonEncodeImpl> { } static Error encode(typename MessageList::Reader data, - Buffer &buffer) { + JsonCodec::WriteContext &buffer) { Error error = buffer.push('['); if (error.failed()) { return error; @@ -237,7 +241,7 @@ struct JsonEncodeImpl...>> { static typename std::enable_if::type encodeMembers( typename MessageStruct...>::Reader data, - Buffer &buffer) { + JsonCodec::WriteContext &buffer) { (void)data; (void)buffer; return Error{}; @@ -246,7 +250,7 @@ struct JsonEncodeImpl...>> { static typename std::enable_if < i::type encodeMembers( typename MessageStruct...>::Reader data, - Buffer &buffer) { + JsonCodec::WriteContext &buffer) { { Error error = buffer.push('\"'); if (error.failed()) { @@ -301,7 +305,7 @@ struct JsonEncodeImpl...>> { static Error encode(typename MessageStruct...>::Reader data, - Buffer &buffer) { + JsonCodec::WriteContext &buffer) { Error error = buffer.push('{'); if (error.failed()) { return error; @@ -324,7 +328,7 @@ struct JsonEncodeImpl...>> { template static typename std::enable_if::type encodeMember( typename MessageUnion...>::Reader data, - Buffer &buffer) { + JsonCodec::WriteContext &buffer) { (void)data; (void)buffer; return noError(); @@ -333,7 +337,7 @@ struct JsonEncodeImpl...>> { static typename std::enable_if < i::type encodeMember( typename MessageUnion...>::Reader reader, - Buffer &buffer) { + JsonCodec::WriteContext &buffer) { /// @todo only encode if alternative is set, skip in other cases /// use holds_alternative @@ -395,7 +399,7 @@ struct JsonEncodeImpl...>> { static Error encode(typename MessageUnion...>::Reader reader, - Buffer &buffer) { + JsonCodec::WriteContext &buffer) { return encodeMember<0>(reader, buffer); } }; @@ -1066,7 +1070,15 @@ ErrorOr> JsonCodec::decodeDynamic(ReadContext &buffer) { template Error JsonCodec::encode(typename T::Reader reader, Buffer &buffer) { - return JsonEncodeImpl::encode(reader, buffer); + WriteContext context{buffer}; + Error error = JsonEncodeImpl::encode(reader, context); + if (error.failed()) { + return error; + } + + buffer.writeAdvance(context.offset); + + return error; } template