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 }