json lists fixed
This commit is contained in:
parent
4d62c9c865
commit
af0f16949a
100
source/json.h
100
source/json.h
|
@ -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;
|
||||
|
|
|
@ -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}; }
|
||||
};
|
||||
|
||||
|
|
|
@ -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)>,
|
||||
|
|
Loading…
Reference in New Issue