diff --git a/source/libpb/deserialization.d b/source/libpb/deserialization.d index 7227b23..64b0940 100644 --- a/source/libpb/deserialization.d +++ b/source/libpb/deserialization.d @@ -3,105 +3,108 @@ module libpb.deserialization; import std.json; import std.traits : FieldTypeTuple, FieldNameTuple; -public RecordType fromJSON(RecordType)(JSONValue jsonIn) +template T(RecordType) { - RecordType record; - - // Alias as to only expand later when used in compile-time - alias structTypes = FieldTypeTuple!(RecordType); - alias structNames = FieldNameTuple!(RecordType); - alias structValues = record.tupleof; - - static foreach(cnt; 0..structTypes.length) + public RecordType fromJSON(JSONValue jsonIn) { - debug(dbg) - { - pragma(msg, structTypes[cnt]); - pragma(msg, structNames[cnt]); - // pragma(msg, structValues[cnt]); - } + RecordType record; - static if(__traits(isSame, mixin(structTypes[cnt]), byte)) - { - mixin("record."~structNames[cnt]) = cast(byte)jsonIn[structNames[cnt]].integer(); - } - else static if(__traits(isSame, mixin(structTypes[cnt]), ubyte)) - { - mixin("record."~structNames[cnt]) = cast(ubyte)jsonIn[structNames[cnt]].uinteger(); - } - else static if(__traits(isSame, mixin(structTypes[cnt]), short)) - { - mixin("record."~structNames[cnt]) = cast(short)jsonIn[structNames[cnt]].integer(); - } - else static if(__traits(isSame, mixin(structTypes[cnt]), ushort)) - { - mixin("record."~structNames[cnt]) = cast(ushort)jsonIn[structNames[cnt]].uinteger(); - } - else static if(__traits(isSame, mixin(structTypes[cnt]), int)) - { - mixin("record."~structNames[cnt]) = cast(int)jsonIn[structNames[cnt]].integer(); - } - else static if(__traits(isSame, mixin(structTypes[cnt]), uint)) - { - mixin("record."~structNames[cnt]) = cast(uint)jsonIn[structNames[cnt]].uinteger(); - } - else static if(__traits(isSame, mixin(structTypes[cnt]), ulong)) - { - mixin("record."~structNames[cnt]) = cast(ulong)jsonIn[structNames[cnt]].uinteger(); - } - else static if(__traits(isSame, mixin(structTypes[cnt]), long)) - { - mixin("record."~structNames[cnt]) = cast(long)jsonIn[structNames[cnt]].integer(); - } - else static if(__traits(isSame, mixin(structTypes[cnt]), string)) - { - mixin("record."~structNames[cnt]) = jsonIn[structNames[cnt]].str(); + // Alias as to only expand later when used in compile-time + alias structTypes = FieldTypeTuple!(RecordType); + alias structNames = FieldNameTuple!(RecordType); + alias structValues = record.tupleof; + static foreach(cnt; 0..structTypes.length) + { debug(dbg) { - pragma(msg,"record."~structNames[cnt]); + pragma(msg, structTypes[cnt]); + pragma(msg, structNames[cnt]); + // pragma(msg, structValues[cnt]); } - } - else static if(__traits(isSame, mixin(structTypes[cnt]), JSONValue)) - { - mixin("record."~structNames[cnt]) = jsonIn[structNames[cnt]]; - debug(dbg) + static if(__traits(isSame, mixin(structTypes[cnt]), byte)) { - pragma(msg,"record."~structNames[cnt]); + mixin("record."~structNames[cnt]) = cast(byte)jsonIn[structNames[cnt]].integer(); } - } - else static if(__traits(isSame, mixin(structTypes[cnt]), bool)) - { - mixin("record."~structNames[cnt]) = jsonIn[structNames[cnt]].boolean(); + else static if(__traits(isSame, mixin(structTypes[cnt]), ubyte)) + { + mixin("record."~structNames[cnt]) = cast(ubyte)jsonIn[structNames[cnt]].uinteger(); + } + else static if(__traits(isSame, mixin(structTypes[cnt]), short)) + { + mixin("record."~structNames[cnt]) = cast(short)jsonIn[structNames[cnt]].integer(); + } + else static if(__traits(isSame, mixin(structTypes[cnt]), ushort)) + { + mixin("record."~structNames[cnt]) = cast(ushort)jsonIn[structNames[cnt]].uinteger(); + } + else static if(__traits(isSame, mixin(structTypes[cnt]), int)) + { + mixin("record."~structNames[cnt]) = cast(int)jsonIn[structNames[cnt]].integer(); + } + else static if(__traits(isSame, mixin(structTypes[cnt]), uint)) + { + mixin("record."~structNames[cnt]) = cast(uint)jsonIn[structNames[cnt]].uinteger(); + } + else static if(__traits(isSame, mixin(structTypes[cnt]), ulong)) + { + mixin("record."~structNames[cnt]) = cast(ulong)jsonIn[structNames[cnt]].uinteger(); + } + else static if(__traits(isSame, mixin(structTypes[cnt]), long)) + { + mixin("record."~structNames[cnt]) = cast(long)jsonIn[structNames[cnt]].integer(); + } + else static if(__traits(isSame, mixin(structTypes[cnt]), string)) + { + mixin("record."~structNames[cnt]) = jsonIn[structNames[cnt]].str(); - debug(dbg) - { - pragma(msg,"record."~structNames[cnt]); + debug(dbg) + { + pragma(msg,"record."~structNames[cnt]); + } } - } - //FIXME: Not sure how to get array support going, very new to meta programming - else static if(__traits(isSame, mixin(structTypes[cnt]), mixin(structTypes[cnt])[])) - { - mixin("record."~structNames[cnt]) = jsonIn[structNames[cnt]].boolean(); + else static if(__traits(isSame, mixin(structTypes[cnt]), JSONValue)) + { + mixin("record."~structNames[cnt]) = jsonIn[structNames[cnt]]; - debug(dbg) + debug(dbg) + { + pragma(msg,"record."~structNames[cnt]); + } + } + else static if(__traits(isSame, mixin(structTypes[cnt]), bool)) { - pragma(msg,"record."~structNames[cnt]); - } - } - else - { - // throw new - //TODO: Throw error - debug(dbg) - { - pragma(msg, "Unknown type for de-serialization"); + mixin("record."~structNames[cnt]) = jsonIn[structNames[cnt]].boolean(); + + debug(dbg) + { + pragma(msg,"record."~structNames[cnt]); + } + } + //FIXME: Not sure how to get array support going, very new to meta programming + else static if(__traits(isSame, mixin(structTypes[cnt]), mixin(structTypes[cnt])[])) + { + mixin("record."~structNames[cnt]) = jsonIn[structNames[cnt]].boolean(); + + debug(dbg) + { + pragma(msg,"record."~structNames[cnt]); + } + } + else + { + // throw new + //TODO: Throw error + debug(dbg) + { + pragma(msg, "Unknown type for de-serialization"); + } } } + + return record; } - - return record; } unittest @@ -128,7 +131,7 @@ unittest } `); - Person person = fromJSON!(Person)(json); + Person person = T!(Person).fromJSON(json); debug(dbg) { diff --git a/source/libpb/driver.d b/source/libpb/driver.d index 4b8c0f7..69b2d4b 100644 --- a/source/libpb/driver.d +++ b/source/libpb/driver.d @@ -158,7 +158,7 @@ public class PocketBase } } - recordsOut ~= fromJSON!(RecordType)(returnedItem); + recordsOut ~= T!(RecordType).fromJSON(returnedItem); } return recordsOut; @@ -268,7 +268,7 @@ public class PocketBase responseJSON["passwordConfirm"] = ""; } - recordOut = fromJSON!(RecordType)(responseJSON); + recordOut = T!(RecordType).fromJSON(responseJSON); return recordOut; } @@ -349,7 +349,7 @@ public class PocketBase } - recordOut = fromJSON!(RecordType)(recordResponse); + recordOut = T!(RecordType).fromJSON(recordResponse); // Store the token token = responseJSON["token"].str(); @@ -448,7 +448,7 @@ public class PocketBase } } - recordOut = fromJSON!(RecordType)(responseJSON); + recordOut = T!(RecordType).fromJSON(responseJSON); return recordOut; } @@ -553,7 +553,7 @@ public class PocketBase } } - recordOut = fromJSON!(RecordType)(responseJSON); + recordOut = T!(RecordType).fromJSON(responseJSON); return recordOut; }