From ea079bbde4cd21df73c1a496afac6404e7969922 Mon Sep 17 00:00:00 2001 From: "Tristan B. Velloza Kildaire" Date: Wed, 28 Jun 2023 12:25:39 +0200 Subject: [PATCH] Deserializer - Added enum deserialization support --- README.md | 6 ---- source/jstruct/deserializer.d | 63 +++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 85e219a..1e6e739 100644 --- a/README.md +++ b/README.md @@ -141,9 +141,3 @@ And then in your D program import as follows: ```d import jstruct; ``` - -## Help wanted - -There are some outstanding issues I want to be able to fix/have implemented, namely: - -- [ ] Support for custom types serialization/deserialization (think `enums` for example) - see issue #2 diff --git a/source/jstruct/deserializer.d b/source/jstruct/deserializer.d index ba4e709..688d202 100644 --- a/source/jstruct/deserializer.d +++ b/source/jstruct/deserializer.d @@ -179,6 +179,26 @@ public RecordType fromJSON(RecordType)(JSONValue jsonIn) pragma(msg,"record."~structNames[cnt]); } } + else static if(is(structTypes[cnt] == enum)) + { + string enumChoice = jsonIn[structNames[cnt]].str(); + + import std.traits: EnumMembers, fullyQualifiedName; + + alias members = EnumMembers!(structTypes[cnt]); + + import std.stdio; + static foreach(member; members) + { + writeln(member); + writeln(fullyQualifiedName!(member)); + writeln(__traits(identifier, member)); + if(__traits(identifier, member) == enumChoice) + { + mixin("record."~structNames[cnt]) = member; + } + } + } else { // throw new @@ -186,6 +206,10 @@ public RecordType fromJSON(RecordType)(JSONValue jsonIn) debug(dbg) { pragma(msg, "Unknown type for de-serialization"); + + pragma(msg, is(structTypes[cnt] == enum)); + + } } } @@ -291,4 +315,43 @@ unittest assert(true); } +} + + +unittest +{ + enum EnumType + { + DOG, + CAT + } + + struct Person + { + public string firstname, lastname; + + + public EnumType animal; + + } + + JSONValue json = parseJSON(`{ +"firstname" : "Tristan", +"lastname": "Kildaire", +"animal" : "CAT" +} +`); + + try + { + Person person = fromJSON!(Person)(json); + import std.stdio : writeln; + writeln(person); + assert(true); + } + catch(DeserializationError) + { + assert(false); + } + } \ No newline at end of file