summaryrefslogtreecommitdiff
path: root/ddl/templates/data.cs.ede
diff options
context:
space:
mode:
Diffstat (limited to 'ddl/templates/data.cs.ede')
-rw-r--r--ddl/templates/data.cs.ede208
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
4using System;
5using System.Linq;
4using System.Collections.Generic; 6using System.Collections.Generic;
7using Newtonsoft.Json.Linq;
5 8
6{% for m in imports %} 9{% for m in imports %}
7using {{ m.value }}; 10using {{ m.value }};
8{% endfor %} 11{% endfor %}
9 12
10{% for t in dataAndType %} 13namespace {{ moduleName }} {
11{% case t.value | constType %} 14 {% for t in dataAndType %}
12{% when "DataDef" %} 15 {% case t.value | constType %}
13class {{ 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 };
20namespace 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 %}