1 module telega.serialization; 2 3 import std.traits; 4 import std.typecons; 5 import std.meta : AliasSeq, staticIndexOf; 6 import asdf; 7 8 string serializeToJsonString(T)(T value) 9 { 10 return serializeToJson(value); 11 } 12 13 unittest 14 { 15 import std.typecons; 16 17 alias FewTypes = AliasSeq!(int, string); 18 19 struct S 20 { 21 JsonableAlgebraicProxy!FewTypes a; 22 } 23 24 S s; 25 s.a = 42; 26 27 assert(`{"a":42}` == s.serializeToJson()); 28 29 s.a = "123"; 30 assert(`{"a":"123"}` == s.serializeToJson()); 31 } 32 33 struct JsonableAlgebraicProxy(Typelist ...) 34 { 35 import std.variant; 36 import asdf; 37 38 private Algebraic!Typelist value; 39 40 //alias value this; 41 42 void opAssign(T)(T value) 43 if (staticIndexOf!(T, Typelist) >= 0) 44 { 45 this.value = value; 46 } 47 48 static Algebraic!Typelist deserialize(Asdf data) 49 { 50 assert(false, "Deserialization of a value is not implemented."); 51 } 52 53 void serialize(S)(ref S serializer) 54 { 55 if (!value.hasValue) { 56 serializer.putValue(null); 57 58 return; 59 } 60 61 static foreach (T; Typelist) { 62 if (value.type == typeid(T)) { 63 T result = cast(T)value.get!T; 64 65 serializer.serializeValue(result); 66 } 67 } 68 } 69 }