From 023e7b7e8d624d3935c183fc572fef532c4fd1b1 Mon Sep 17 00:00:00 2001 From: "Tristan B. Velloza Kildaire" Date: Fri, 23 Jun 2023 08:27:39 +0200 Subject: [PATCH] Serializer - There was no need to mix these in as they are symbols already, it would have made sense if they were strings - Added support for array detection Unit tests - Added serialization check for the serialized array --- source/jstruct/serializer.d | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/source/jstruct/serializer.d b/source/jstruct/serializer.d index 15d7ca6..ed492e8 100644 --- a/source/jstruct/serializer.d +++ b/source/jstruct/serializer.d @@ -3,6 +3,7 @@ module jstruct.serializer; import std.json; import std.conv : to; import std.traits : FieldTypeTuple, FieldNameTuple; + import std.traits : isArray; public JSONValue serializeRecord(RecordType)(RecordType record) { @@ -23,35 +24,42 @@ public JSONValue serializeRecord(RecordType)(RecordType record) // pragma(msg, structValues[cnt]); } + import std.traits : isArray; - static if(__traits(isSame, mixin(structTypes[cnt]), int)) + + static if(__traits(isSame, structTypes[cnt], int)) { builtJSON[structNames[cnt]] = structValues[cnt]; } - else static if(__traits(isSame, mixin(structTypes[cnt]), uint)) + else static if(__traits(isSame, structTypes[cnt], uint)) { builtJSON[structNames[cnt]] = structValues[cnt]; } - else static if(__traits(isSame, mixin(structTypes[cnt]), ulong)) + else static if(__traits(isSame, structTypes[cnt], ulong)) { builtJSON[structNames[cnt]] = structValues[cnt]; } - else static if(__traits(isSame, mixin(structTypes[cnt]), long)) + else static if(__traits(isSame, structTypes[cnt], long)) { builtJSON[structNames[cnt]] = structValues[cnt]; } - else static if(__traits(isSame, mixin(structTypes[cnt]), string)) + else static if(__traits(isSame, structTypes[cnt], string)) { builtJSON[structNames[cnt]] = structValues[cnt]; } - else static if(__traits(isSame, mixin(structTypes[cnt]), JSONValue)) + else static if(__traits(isSame, structTypes[cnt], JSONValue)) { builtJSON[structNames[cnt]] = structValues[cnt]; } - else static if(__traits(isSame, mixin(structTypes[cnt]), bool)) + else static if(__traits(isSame, structTypes[cnt], bool)) { builtJSON[structNames[cnt]] = structValues[cnt]; } + else static if(isArray!(structTypes[cnt])) + { + builtJSON[structNames[cnt]] = structValues[cnt]; + // pragma(msg, "WAIT", "d"~mixin(structTypes[cnt])); + } else { debug(dbg) @@ -102,6 +110,14 @@ unittest assert(canFind(keys, "lastname") && cmp(serialized["lastname"].str(), "Kildaire") == 0); assert(canFind(keys, "age") && serialized["age"].integer() == 23); + assert(canFind(keys, "list")); + JSONValue[] elems = serialized["list"].array(); + for(ulong i = 0; i < elems.length; i++) + { + string curElem = elems[i].str(); + assert(curElem == p1.list[i]); + } + debug(dbg) { writeln(serialized.toPrettyString());