json lists fixed

This commit is contained in:
keldu.magnus 2021-03-02 12:31:15 +01:00
parent 4d62c9c865
commit af0f16949a
3 changed files with 105 additions and 21 deletions

View File

@ -384,6 +384,59 @@ template <> struct JsonDecodeImpl<MessagePrimitive<std::string>> {
}
};
template <typename... T> struct JsonDecodeImpl<MessageList<T...>> {
template <size_t i = 0>
static typename std::enable_if<i == sizeof...(T), Error>::type
decodeMembers(typename MessageList<T...>::Builder builder,
DynamicMessageList::Reader reader) {
(void)builder;
(void)reader;
return noError();
}
template <size_t i = 0>
static typename std::enable_if <
i<sizeof...(T), Error>::type
decodeMembers(typename MessageList<T...>::Builder builder,
DynamicMessageList::Reader reader) {
DynamicMessage::DynamicReader member_reader = reader.get(i);
{
Error error =
JsonDecodeImpl<typename ParameterPackType<i, T...>::type>::
decode(builder.template init<i>(), member_reader);
if (error.failed()) {
return error;
}
}
{
Error error =
JsonDecodeImpl<MessageList<T...>>::decodeMembers<i + 1>(builder,
reader);
if (error.failed()) {
return error;
}
}
return noError();
}
static Error decode(typename MessageList<T...>::Builder builder,
DynamicMessage::DynamicReader reader) {
if (reader.type() != DynamicMessage::Type::List) {
return criticalError("Not a list");
}
Error error = JsonDecodeImpl<MessageList<T...>>::decodeMembers<0>(
builder, reader.as<DynamicMessageList>());
if (error.failed()) {
return error;
}
return noError();
}
};
template <typename... V, typename... K>
struct JsonDecodeImpl<MessageStruct<MessageStructMember<V, K>...>> {
template <size_t i = 0>
@ -789,17 +842,34 @@ private:
if (buffer.readCompositeLength() == 0) {
return recoverableError("Buffer too short");
}
if (buffer.read() == ']') {
buffer.readAdvance(1);
return noError();
}
Own<DynamicMessage> message = nullptr;
{ Error error = decodeValue(message, buffer); }
while (buffer.read() != ']') {
/// @todo unimplemented
assert(false);
Own<DynamicMessage> message = nullptr;
{
Error error = decodeValue(message, buffer);
if (error.failed()) {
return error;
}
}
builder.push(std::move(message));
if (buffer.readCompositeLength() == 0) {
return recoverableError("Buffer too short");
}
switch (buffer.read()) {
case ']':
break;
case ',':
buffer.readAdvance(1);
skipWhitespace(buffer);
if (buffer.readCompositeLength() == 0) {
return recoverableError("Buffer too short");
}
break;
default:
return criticalError("Not a JSON Object");
}
}
buffer.readAdvance(1);
return noError();
@ -812,10 +882,6 @@ private:
if (buffer.readCompositeLength() == 0) {
return recoverableError("Buffer too short");
}
if (buffer.read() == '}') {
buffer.readAdvance(1);
return noError();
}
while (buffer.read() != '}') {
if (buffer.read() == '"') {
@ -846,14 +912,6 @@ private:
return recoverableError("Buffer too short");
}
/*
skipWhitespace(buffer);
if(buffer.readCompositeLength() == 0){
return recoverableError("Buffer too short");
}
/// @todo value decode
skipWhitespace(buffer);
*/
switch (buffer.read()) {
case '}':
break;

View File

@ -239,6 +239,12 @@ public:
return builder;
}
DynamicMessage::DynamicBuilder push(Own<DynamicMessage> &&msg) {
DynamicMessage::DynamicBuilder builder{*msg};
message.messages.push_back(std::move(msg));
return builder;
}
Reader asReader() const { return Reader{message}; }
};

View File

@ -142,6 +142,26 @@ GIN_TEST("JSON Struct Decoding"){
GIN_EXPECT( reader.get<decltype("test_bool"_t)>().get() == true, "Test Bool has wrong value" );
}
GIN_TEST("JSON List Decoding"){
std::string json_string = R"(
[
12, "free"
])";
auto builder = heapMessageBuilder();
TestList::Builder root = builder.initRoot<TestList>();
JsonCodec codec;
RingBuffer temp_buffer;
temp_buffer.push(*reinterpret_cast<const uint8_t*>(json_string.data()), json_string.size());
Error error = codec.decode<TestList>(root, temp_buffer);
GIN_EXPECT( !error.failed(), error.message() );
auto reader = root.asReader();
GIN_EXPECT( reader.get<0>().get() == 12, "Test Unsigned has wrong value" );
GIN_EXPECT( reader.get<1>().get() == "free", "Test String has wrong value" );
}
typedef MessageStruct<
MessageStructMember<MessagePrimitive<uint32_t>, decltype("test_uint"_t)>,
MessageStructMember<TestStruct, decltype("test_struct"_t)>,