diff options
author | Csaba Hruska <csaba.hruska@gmail.com> | 2016-03-20 22:44:29 +0100 |
---|---|---|
committer | Csaba Hruska <csaba.hruska@gmail.com> | 2016-03-21 14:12:02 +0100 |
commit | c5e063b3c9aeff65161e24445e9672daff980b45 (patch) | |
tree | f469f6e8eb1a24060b01453f3f23db5c72a4850c /ddl/templates/data.cs.ede | |
parent | 3b50722f433ec5ecc515ea1441fd633d85118cb9 (diff) |
working c# backend
Diffstat (limited to 'ddl/templates/data.cs.ede')
-rw-r--r-- | ddl/templates/data.cs.ede | 208 |
1 files changed, 191 insertions, 17 deletions
diff --git a/ddl/templates/data.cs.ede b/ddl/templates/data.cs.ede index c88d41c..13d20f9 100644 --- a/ddl/templates/data.cs.ede +++ b/ddl/templates/data.cs.ede | |||
@@ -1,27 +1,201 @@ | |||
1 | // generated file, do not modify! | 1 | // generated file, do not modify! |
2 | // {{ dateTime }} | 2 | // {{ dateTime }} |
3 | 3 | ||
4 | using System; | ||
5 | using System.Linq; | ||
4 | using System.Collections.Generic; | 6 | using System.Collections.Generic; |
7 | using Newtonsoft.Json.Linq; | ||
5 | 8 | ||
6 | {% for m in imports %} | 9 | {% for m in imports %} |
7 | using {{ m.value }}; | 10 | using {{ m.value }}; |
8 | {% endfor %} | 11 | {% endfor %} |
9 | 12 | ||
10 | {% for t in dataAndType %} | 13 | namespace {{ moduleName }} { |
11 | {% case t.value | constType %} | 14 | {% for t in dataAndType %} |
12 | {% when "DataDef" %} | 15 | {% case t.value | constType %} |
13 | class {{ t.value.dataName }} { | 16 | {% when "DataDef" %} |
14 | public enum Tag { {% for c in t.value.constructors %} | 17 | class {{ t.value.dataName }} { |
15 | {{ c.value.name }}{% if !c.last %},{% endif %}{% endfor %} | 18 | public enum Tag { {% for c in t.value.constructors %} |
16 | }; | 19 | {{ c.value.name }}{% if !c.last %},{% endif %}{% endfor %} |
17 | public Tag tag; | 20 | }; |
18 | }; | 21 | public Tag tag; |
19 | 22 | }; | |
20 | namespace data { {% for c in t.value.constructors %}{% if !(c.value.fields | empty) %} | 23 | |
21 | class {{ c.value.name }} : global::{{ t.value.dataName }} { {% for f in c.value.fields %}{% if c.value.fields | hasFieldNames %} | 24 | namespace data { {% for c in t.value.constructors %}{% if !(c.value.fields | empty) %} |
22 | public {{ f.value.fieldType | csType }} {{ f.value.fieldName }};{% else %} | 25 | class {{ c.value.name }} : {{ moduleName }}.{{ t.value.dataName }} { {% for f in c.value.fields %}{% if c.value.fields | hasFieldNames %} |
23 | public {{ f.value.fieldType | csType | parens }} _{{ f.index0 }};{% endif %}{% endfor %} | 26 | public {{ f.value.fieldType | csType }} {{ f.value.fieldName }};{% else %} |
24 | };{% endif %}{% endfor %} | 27 | public {{ f.value.fieldType | csType | parens }} _{{ f.index0 }};{% endif %}{% endfor %} |
28 | public {{ c.value.name }}() { tag = {{ moduleName }}.{{ t.value.dataName }}.Tag.{{ c.value.name }}; } | ||
29 | };{% endif %}{% endfor %} | ||
30 | } | ||
31 | {% endcase %} | ||
32 | {% endfor %} | ||
33 | |||
34 | // JSON deserializer | ||
35 | enum Type { {% for t in usedTypes %} | ||
36 | {{ t.value | csTypeEnum }}{% if !t.last %},{% endif %}{% endfor %} | ||
37 | } | ||
38 | |||
39 | class Loader { | ||
40 | public static object fromJSON(Type type, JToken obj) { | ||
41 | switch (type) { | ||
42 | {% for t in usedTypes %} | ||
43 | {% case t.value.tag %} | ||
44 | {% when "Data" %} | ||
45 | {% when "V2" %} | ||
46 | case Type.{{ t.value | csTypeEnum }}: | ||
47 | return new {{ t.value | csType }} | ||
48 | { x = ({{ t.value.type_ | csType }})fromJSON(Type.{{ t.value | csTypeEnum }},obj["x"]) | ||
49 | , y = ({{ t.value.type_ | csType }})fromJSON(Type.{{ t.value | csTypeEnum }},obj["y"]) | ||
50 | }; | ||
51 | {% when "V3" %} | ||
52 | case Type.{{ t.value | csTypeEnum }}: | ||
53 | return new {{ t.value | csType }} | ||
54 | { x = ({{ t.value.type_ | csType }})fromJSON(Type.{{ t.value | csTypeEnum }},obj["x"]) | ||
55 | , y = ({{ t.value.type_ | csType }})fromJSON(Type.{{ t.value | csTypeEnum }},obj["y"]) | ||
56 | , z = ({{ t.value.type_ | csType }})fromJSON(Type.{{ t.value | csTypeEnum }},obj["z"]) | ||
57 | }; | ||
58 | {% when "V4" %} | ||
59 | case Type.{{ t.value | csTypeEnum }}: | ||
60 | return new {{ t.value | csType }} | ||
61 | { x = ({{ t.value.type_ | csType }})fromJSON(Type.{{ t.value | csTypeEnum }},obj["x"]) | ||
62 | , y = ({{ t.value.type_ | csType }})fromJSON(Type.{{ t.value | csTypeEnum }},obj["y"]) | ||
63 | , z = ({{ t.value.type_ | csType }})fromJSON(Type.{{ t.value | csTypeEnum }},obj["z"]) | ||
64 | , w = ({{ t.value.type_ | csType }})fromJSON(Type.{{ t.value | csTypeEnum }},obj["w"]) | ||
65 | }; | ||
66 | {% when "Map" %} | ||
67 | case Type.{{ t.value | csTypeEnum }}: { | ||
68 | var map = new {{ t.value | csType }} (); | ||
69 | foreach(var i in (JObject)obj) { | ||
70 | map.Add( ({{ t.value.key_ | csType }})fromJSON(Type.{{ t.value.key_ | csTypeEnum }},i.Key) | ||
71 | , ({{ t.value.value_ | csType }})fromJSON(Type.{{ t.value.value_ | csTypeEnum }},i.Value)); | ||
72 | } | ||
73 | return map; | ||
74 | } | ||
75 | {% when "Array" %} | ||
76 | case Type.{{ t.value | csTypeEnum }}: return ((JArray)obj).Select(x => fromJSON (Type.{{ t.value.type_ | csTypeEnum }}, x)).ToList(); | ||
77 | {% when "List" %} | ||
78 | case Type.{{ t.value | csTypeEnum }}: return ((JArray)obj).Select(x => fromJSON (Type.{{ t.value.type_ | csTypeEnum }}, x)).ToList(); | ||
79 | {% when "Maybe" %} | ||
80 | case Type.{{ t.value | csTypeEnum }}: { | ||
81 | var m = new {{ t.value | csType }} (); | ||
82 | if (obj == null || obj.Type == JTokenType.Null) { | ||
83 | m.valid = false; | ||
84 | } else { | ||
85 | m.valid = true; | ||
86 | m.data = ({{ t.value.type_ | csType }})fromJSON (Type.{{ t.value.type_ | csTypeEnum }},obj); | ||
87 | } | ||
88 | return m; | ||
89 | } | ||
90 | {% else %} | ||
91 | case Type.{{ t.value | csTypeEnum }}: return ({{ t.value | csType }})obj; | ||
92 | {% endcase %} | ||
93 | {% endfor %} | ||
94 | |||
95 | {% for t in definitions %} | ||
96 | case Type.{{ t.value.dataName }}: { | ||
97 | string tag = (string)obj["tag"]; | ||
98 | {{ t.value.dataName }}.Tag tagType; | ||
99 | {% for c in t.value.constructors %} | ||
100 | {% if !c.first %}else {% endif %}if (tag == "{{ c.value.name }}") { | ||
101 | tagType = {{ t.value.dataName }}.Tag.{{ c.value.name }}; | ||
102 | {% if !(c.value.fields | empty) %} | ||
103 | data.{{ c.value.name }} tv = new data.{{ c.value.name }}();{% for f in c.value.fields %}{% if c.value.fields | hasFieldNames %} | ||
104 | tv.{{ f.value.fieldName }} = ({{ f.value.fieldType | csType }})fromJSON(Type.{{ f.value.fieldType | csTypeEnum }},obj["{{ f.value.fieldName }}"]);{% else %} | ||
105 | tv._{{ f.index0 }} = ({{ f.value.fieldType | csType }})fromJSON(Type.{{ f.value.fieldType | csTypeEnum }},obj["arg{{ f.index0 }}"]);{% endif %}{% endfor %} | ||
106 | return tv; | ||
107 | {% endif %} | ||
108 | } | ||
109 | {% endfor %} | ||
110 | else throw new Exception("unknown constructor: " + tag); | ||
111 | {{ t.value.dataName }} o = new {{ t.value.dataName }}(); | ||
112 | o.tag = tagType; | ||
113 | return o; | ||
114 | } | ||
115 | {% endfor %} | ||
116 | } | ||
117 | throw new Exception("unknown type"); | ||
118 | return null; | ||
119 | } | ||
120 | |||
121 | {% for t in definitions %} | ||
122 | JToken toJSON({{ t.value.dataName }} v) { | ||
123 | var obj = new JObject(); | ||
124 | switch (v.tag) { {% for c in t.value.constructors %} | ||
125 | case {{ t.value.dataName }}.Tag.{{ c.value.name }}: | ||
126 | obj["tag"] = "{{ c.value.name }}";{% if !(c.value.fields | empty) %} | ||
127 | { | ||
128 | var tv = (data.{{ c.value.name }})v;{% for f in c.value.fields %}{% if c.value.fields | hasFieldNames %} | ||
129 | obj["{{ f.value.fieldName }}"] = toJSON(tv.{{ f.value.fieldName }});{% else %} | ||
130 | obj["arg{{ f.index0 }}"] = toJSON(tv._{{ f.index0 }});{% endif %}{% endfor %} | ||
131 | }{% endif %} | ||
132 | break;{% endfor %} | ||
133 | } | ||
134 | return obj; | ||
135 | } | ||
136 | {% endfor %} | ||
137 | |||
138 | {% for t in usedCSTypes %} | ||
139 | {% case t.value.tag %} | ||
140 | {% when "Data" %} | ||
141 | {% when "V2" %} | ||
142 | JToken toJSON({{ t.value | csType }} v) { | ||
143 | var obj = new JObject(); | ||
144 | obj["x"] = toJSON(v.x); | ||
145 | obj["y"] = toJSON(v.y); | ||
146 | return obj; | ||
147 | } | ||
148 | {% when "V3" %} | ||
149 | JToken toJSON({{ t.value | csType }} v) { | ||
150 | var obj = new JObject(); | ||
151 | obj["x"] = toJSON(v.x); | ||
152 | obj["y"] = toJSON(v.y); | ||
153 | obj["z"] = toJSON(v.z); | ||
154 | return obj; | ||
155 | } | ||
156 | {% when "V4" %} | ||
157 | JToken toJSON({{ t.value | csType }} v) { | ||
158 | var obj = new JObject(); | ||
159 | obj["x"] = toJSON(v.x); | ||
160 | obj["y"] = toJSON(v.y); | ||
161 | obj["z"] = toJSON(v.z); | ||
162 | obj["w"] = toJSON(v.w); | ||
163 | return obj; | ||
164 | } | ||
165 | {% when "Maybe" %} | ||
166 | JToken toJSON({{ t.value | csType }} v) { | ||
167 | if (v.valid) { | ||
168 | return toJSON(v.data); | ||
169 | } | ||
170 | return new JValue((string)null); | ||
171 | } | ||
172 | {% when "Map" %} | ||
173 | JToken toJSON({{ t.value | csType }} v) { | ||
174 | var obj = new JObject(); | ||
175 | foreach (var i in v) { | ||
176 | obj[i.Key] = toJSON(i.Value); | ||
177 | } | ||
178 | return obj; | ||
179 | } | ||
180 | {% when "Array" %} | ||
181 | JToken toJSON({{ t.value | csType }} v) { | ||
182 | var obj = new JArray(); | ||
183 | foreach (var i in v) { | ||
184 | obj.Add(toJSON(i)); | ||
185 | } | ||
186 | return obj; | ||
187 | } | ||
188 | {% when "List" %} | ||
189 | JToken toJSON({{ t.value | csType }} v) { | ||
190 | var obj = new JArray(); | ||
191 | foreach (var i in v) { | ||
192 | obj.Add(toJSON(i)); | ||
193 | } | ||
194 | return obj; | ||
195 | } | ||
196 | {% else %} | ||
197 | JToken toJSON({{ t.value | csType }} v) { return new JValue(v); } | ||
198 | {% endcase %} | ||
199 | {% endfor %} | ||
200 | } | ||
25 | } | 201 | } |
26 | {% endcase %} | ||
27 | {% endfor %} | ||