json-as 1.1.14 → 1.1.15-preview.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +19 -1
- package/assembly/__tests__/array.spec.ts +130 -159
- package/assembly/__tests__/generics.spec.ts +32 -23
- package/assembly/__tests__/lib/index.ts +7 -3
- package/assembly/__tests__/resolving.spec.ts +13 -5
- package/assembly/__tests__/staticarray.spec.ts +12 -0
- package/assembly/__tests__/types.spec.ts +3 -2
- package/assembly/deserialize/simple/array/raw.ts +106 -0
- package/assembly/deserialize/simple/array.ts +5 -1
- package/assembly/index.ts +12 -10
- package/assembly/test.tmp.ts +378 -0
- package/assembly/test.ts +71 -28
- package/assembly/types.ts +26 -18
- package/package.json +23 -23
- package/publish.sh +78 -0
- package/transform/lib/builder.js.map +1 -1
- package/transform/lib/index.js +40 -59
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/linkers/custom.js.map +1 -1
- package/transform/lib/types.js +31 -1
- package/transform/lib/types.js.map +1 -1
- package/transform/src/builder.ts +1 -1
- package/transform/src/index.ts +270 -302
- package/transform/src/linkers/alias.ts +1 -2
- package/transform/src/linkers/classes.ts +1 -1
- package/transform/src/linkers/custom.ts +26 -26
- package/transform/src/types.ts +34 -2
- package/assembly/test.json.ts +0 -388
|
@@ -9,6 +9,7 @@ import { deserializeStructArray } from "./array/struct";
|
|
|
9
9
|
import { deserializeStringArray } from "./array/string";
|
|
10
10
|
import { deserializeObjectArray } from "./array/object";
|
|
11
11
|
import { deserializeBoxArray } from "./array/box";
|
|
12
|
+
import { deserializeRawArray } from "./array/raw";
|
|
12
13
|
|
|
13
14
|
// @ts-ignore: Decorator valid here
|
|
14
15
|
export function deserializeArray<T extends unknown[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
|
|
@@ -23,7 +24,7 @@ export function deserializeArray<T extends unknown[]>(srcStart: usize, srcEnd: u
|
|
|
23
24
|
} else if (isFloat<valueof<T>>()) {
|
|
24
25
|
// @ts-ignore
|
|
25
26
|
return deserializeFloatArray<T>(srcStart, srcEnd, dst);
|
|
26
|
-
} else if (
|
|
27
|
+
} else if (isArray<valueof<T>>()) {
|
|
27
28
|
// @ts-ignore: type
|
|
28
29
|
return deserializeArrayArray<T>(srcStart, srcEnd, dst);
|
|
29
30
|
} else if (isManaged<valueof<T>>() || isReference<valueof<T>>()) {
|
|
@@ -37,6 +38,9 @@ export function deserializeArray<T extends unknown[]>(srcStart: usize, srcEnd: u
|
|
|
37
38
|
} else if (type instanceof JSON.Obj) {
|
|
38
39
|
// @ts-ignore: type
|
|
39
40
|
return deserializeObjectArray<T>(srcStart, srcEnd, dst);
|
|
41
|
+
} else if (type instanceof JSON.Raw) {
|
|
42
|
+
// @ts-ignore: type
|
|
43
|
+
return deserializeRawArray(srcStart, srcEnd, dst);
|
|
40
44
|
} else if (type instanceof Map) {
|
|
41
45
|
// @ts-ignore: type
|
|
42
46
|
return deserializeMapArray<T>(srcStart, srcEnd, dst);
|
package/assembly/index.ts
CHANGED
|
@@ -131,7 +131,7 @@ export namespace JSON {
|
|
|
131
131
|
memory.copy(changetype<usize>(out) + 2, changetype<usize>(data.toISOString()), 48);
|
|
132
132
|
store<u16>(changetype<usize>(out), QUOTE, 50);
|
|
133
133
|
return changetype<string>(out);
|
|
134
|
-
} else if (data instanceof Array) {
|
|
134
|
+
} else if (data instanceof Array || data instanceof StaticArray) {
|
|
135
135
|
// @ts-ignore
|
|
136
136
|
inline.always(serializeArray(changetype<nonnull<T>>(data)));
|
|
137
137
|
return bs.out<string>();
|
|
@@ -332,13 +332,6 @@ export namespace JSON {
|
|
|
332
332
|
this.type = JSON.Types.Struct;
|
|
333
333
|
store<T>(changetype<usize>(this), value, STORAGE);
|
|
334
334
|
// @ts-ignore: supplied by transform
|
|
335
|
-
} else if (isDefined(value.__SERIALIZE_CUSTOM)) {
|
|
336
|
-
this.type = idof<T>() + JSON.Types.Struct;
|
|
337
|
-
// @ts-ignore
|
|
338
|
-
if (!JSON.Value.METHODS.has(idof<T>())) JSON.Value.METHODS.set(idof<T>(), value.__SERIALIZE_CUSTOM.index);
|
|
339
|
-
// @ts-ignore
|
|
340
|
-
store<usize>(changetype<usize>(this), changetype<usize>(value), STORAGE);
|
|
341
|
-
// @ts-ignore: supplied by transform
|
|
342
335
|
} else if (isDefined(value.__SERIALIZE)) {
|
|
343
336
|
this.type = idof<T>() + JSON.Types.Struct;
|
|
344
337
|
// @ts-ignore
|
|
@@ -364,6 +357,15 @@ export namespace JSON {
|
|
|
364
357
|
return load<T>(changetype<usize>(this), STORAGE);
|
|
365
358
|
}
|
|
366
359
|
|
|
360
|
+
/**
|
|
361
|
+
* Gets the value of the JSON.Value instance.
|
|
362
|
+
* Alias for .get<T>()
|
|
363
|
+
* @returns The encapsulated value.
|
|
364
|
+
*/
|
|
365
|
+
@inline as<T>(): T {
|
|
366
|
+
return load<T>(changetype<usize>(this), STORAGE);
|
|
367
|
+
}
|
|
368
|
+
|
|
367
369
|
/**
|
|
368
370
|
* Converts the JSON.Value to a string representation.
|
|
369
371
|
* @returns The string representation of the JSON.Value.
|
|
@@ -552,7 +554,7 @@ export namespace JSON {
|
|
|
552
554
|
} else if (src instanceof Date) {
|
|
553
555
|
// @ts-ignore
|
|
554
556
|
inline.always(serializeDate(changetype<nonnull<T>>(src)));
|
|
555
|
-
} else if (src instanceof Array) {
|
|
557
|
+
} else if (src instanceof Array || src instanceof StaticArray) {
|
|
556
558
|
// @ts-ignore
|
|
557
559
|
serializeArray(changetype<nonnull<T>>(src));
|
|
558
560
|
} else if (src instanceof Map) {
|
|
@@ -733,7 +735,7 @@ export namespace JSON {
|
|
|
733
735
|
memory.copy(changetype<usize>(out) + 2, changetype<usize>(data.toISOString()), 48);
|
|
734
736
|
store<u16>(changetype<usize>(out), QUOTE, 50);
|
|
735
737
|
return changetype<string>(out);
|
|
736
|
-
} else if (data instanceof Array) {
|
|
738
|
+
} else if (data instanceof Array || data instanceof StaticArray) {
|
|
737
739
|
bs.saveState();
|
|
738
740
|
// @ts-ignore
|
|
739
741
|
inline.always(serializeArray(changetype<nonnull<T>>(data)));
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import { bs } from "../lib/as-bs";
|
|
2
|
+
import { JSON } from ".";
|
|
3
|
+
|
|
4
|
+
@json
|
|
5
|
+
class GenericEnum<T> {
|
|
6
|
+
private tag: string = "";
|
|
7
|
+
private value: T | null = null;
|
|
8
|
+
constructor() {
|
|
9
|
+
this.tag = "";
|
|
10
|
+
this.value = null;
|
|
11
|
+
}
|
|
12
|
+
static create<T>(tag: string, value: T): GenericEnum<T> {
|
|
13
|
+
const item = new GenericEnum<T>();
|
|
14
|
+
item.tag = tag;
|
|
15
|
+
item.value = value;
|
|
16
|
+
return item;
|
|
17
|
+
}
|
|
18
|
+
getTag(): string {
|
|
19
|
+
return this.tag;
|
|
20
|
+
}
|
|
21
|
+
getValue(): T | null {
|
|
22
|
+
return this.value;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
@serializer
|
|
26
|
+
@inline
|
|
27
|
+
serialize<T>(self: GenericEnum<T>): string {
|
|
28
|
+
const tagJson = JSON.internal.stringify(self.tag);
|
|
29
|
+
const valueJson = JSON.internal.stringify(self.value);
|
|
30
|
+
return `{${tagJson}:${valueJson}}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@deserializer
|
|
34
|
+
@inline
|
|
35
|
+
deserialize(data: string): GenericEnum<T> {
|
|
36
|
+
const parsed = JSON.parse<Map<string, JSON.Raw>>(data);
|
|
37
|
+
const result = new GenericEnum<T>();
|
|
38
|
+
const keys = parsed.keys();
|
|
39
|
+
const values = parsed.values();
|
|
40
|
+
result.tag = keys[0];
|
|
41
|
+
result.value = JSON.parse<T>(values[0].data);
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
__SERIALIZE(ptr: usize): void {
|
|
45
|
+
const data = this.serialize(this);
|
|
46
|
+
bs.resetState();
|
|
47
|
+
const dataSize = data.length << 1;
|
|
48
|
+
memory.copy(bs.offset, changetype<usize>(data), dataSize);
|
|
49
|
+
bs.offset += dataSize;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@inline
|
|
53
|
+
__INITIALIZE(): this {
|
|
54
|
+
this.tag = "";
|
|
55
|
+
this.value = null;
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
__DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): __JSON_T {
|
|
59
|
+
return inline.always(this.deserialize(JSON.Util.ptrToStr(srcStart, srcEnd)));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@json
|
|
64
|
+
class Node<T> {
|
|
65
|
+
name: string;
|
|
66
|
+
id: u32;
|
|
67
|
+
data: T;
|
|
68
|
+
constructor() {
|
|
69
|
+
this.name = "";
|
|
70
|
+
this.id = 0;
|
|
71
|
+
this.data = changetype<T>(0);
|
|
72
|
+
}
|
|
73
|
+
__SERIALIZE(ptr: usize): void {
|
|
74
|
+
bs.proposeSize(66);
|
|
75
|
+
store<u64>(bs.offset, 27303545189564539, 0);
|
|
76
|
+
store<u64>(bs.offset, 16325694684725357, 8);
|
|
77
|
+
bs.offset += 16;
|
|
78
|
+
JSON.__serialize<string>(load<string>(ptr, offsetof<this>("name")));
|
|
79
|
+
store<u64>(bs.offset, 28147948644859948, 0);
|
|
80
|
+
store<u32>(bs.offset, 3801122, 8);
|
|
81
|
+
bs.offset += 12;
|
|
82
|
+
JSON.__serialize<u32>(load<u32>(ptr, offsetof<this>("id")));
|
|
83
|
+
store<u64>(bs.offset, 27303502239891500, 0);
|
|
84
|
+
store<u64>(bs.offset, 16325694684463220, 8);
|
|
85
|
+
bs.offset += 16;
|
|
86
|
+
JSON.__serialize<T>(load<T>(ptr, offsetof<this>("data")));
|
|
87
|
+
store<u16>(bs.offset, 125, 0);
|
|
88
|
+
bs.offset += 2;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@inline
|
|
92
|
+
__INITIALIZE(): this {
|
|
93
|
+
this.name = "";
|
|
94
|
+
return this;
|
|
95
|
+
}
|
|
96
|
+
__DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): __JSON_T {
|
|
97
|
+
let keyStart: usize = 0;
|
|
98
|
+
let keyEnd: usize = 0;
|
|
99
|
+
let isKey = false;
|
|
100
|
+
let depth: i32 = 0;
|
|
101
|
+
let lastIndex: usize = 0;
|
|
102
|
+
while (srcStart < srcEnd && JSON.Util.isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
103
|
+
while (srcEnd > srcStart && JSON.Util.isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2;
|
|
104
|
+
if (srcStart - srcEnd == 0) throw new Error("Input string had zero length or was all whitespace");
|
|
105
|
+
if (load<u16>(srcStart) != 123) throw new Error("Expected '{' at start of object at position " + (srcEnd - srcStart).toString());
|
|
106
|
+
if (load<u16>(srcEnd - 2) != 125) throw new Error("Expected '}' at end of object at position " + (srcEnd - srcStart).toString());
|
|
107
|
+
srcStart += 2;
|
|
108
|
+
while (srcStart < srcEnd) {
|
|
109
|
+
let code = load<u16>(srcStart);
|
|
110
|
+
while (JSON.Util.isSpace(code)) code = load<u16>((srcStart += 2));
|
|
111
|
+
if (keyStart == 0) {
|
|
112
|
+
if (code == 34 && load<u16>(srcStart - 2) !== 92) {
|
|
113
|
+
if (isKey) {
|
|
114
|
+
keyStart = lastIndex;
|
|
115
|
+
keyEnd = srcStart;
|
|
116
|
+
console.log("Key: " + JSON.Util.ptrToStr(keyStart, keyEnd));
|
|
117
|
+
while (JSON.Util.isSpace((code = load<u16>((srcStart += 2))))) {}
|
|
118
|
+
if (code !== 58) throw new Error("Expected ':' after key at position " + (srcEnd - srcStart).toString());
|
|
119
|
+
isKey = false;
|
|
120
|
+
} else {
|
|
121
|
+
isKey = true;
|
|
122
|
+
lastIndex = srcStart + 2;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
srcStart += 2;
|
|
126
|
+
} else {
|
|
127
|
+
if (code == 34) {
|
|
128
|
+
lastIndex = srcStart;
|
|
129
|
+
srcStart += 2;
|
|
130
|
+
while (srcStart < srcEnd) {
|
|
131
|
+
const code = load<u16>(srcStart);
|
|
132
|
+
if (code == 34 && load<u16>(srcStart - 2) !== 92) {
|
|
133
|
+
console.log("Value (string, 8): " + JSON.Util.ptrToStr(lastIndex, srcStart + 2));
|
|
134
|
+
switch (<u32>keyEnd - <u32>keyStart) {
|
|
135
|
+
case 8: {
|
|
136
|
+
const code64 = load<u64>(keyStart);
|
|
137
|
+
if (code64 == 28429440805568622) {
|
|
138
|
+
store<string>(changetype<usize>(out), JSON.__deserialize<string>(lastIndex, srcStart + 2), offsetof<this>("name"));
|
|
139
|
+
srcStart += 4;
|
|
140
|
+
keyStart = 0;
|
|
141
|
+
break;
|
|
142
|
+
} else if (isString<T>() && code64 == 27303570963497060) {
|
|
143
|
+
store<T>(changetype<usize>(out), JSON.__deserialize<T>(lastIndex, srcStart + 2), offsetof<this>("data"));
|
|
144
|
+
srcStart += 4;
|
|
145
|
+
keyStart = 0;
|
|
146
|
+
break;
|
|
147
|
+
} else {
|
|
148
|
+
srcStart += 4;
|
|
149
|
+
keyStart = 0;
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
default: {
|
|
155
|
+
srcStart += 4;
|
|
156
|
+
keyStart = 0;
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
srcStart += 2;
|
|
163
|
+
}
|
|
164
|
+
} else if (code - 48 <= 9 || code == 45) {
|
|
165
|
+
lastIndex = srcStart;
|
|
166
|
+
srcStart += 2;
|
|
167
|
+
while (srcStart < srcEnd) {
|
|
168
|
+
const code = load<u16>(srcStart);
|
|
169
|
+
if (code == 44 || code == 125 || JSON.Util.isSpace(code)) {
|
|
170
|
+
console.log("Value (number, 9): " + JSON.Util.ptrToStr(lastIndex, srcStart));
|
|
171
|
+
switch (<u32>keyEnd - <u32>keyStart) {
|
|
172
|
+
case 4: {
|
|
173
|
+
const code32 = load<u32>(keyStart);
|
|
174
|
+
if (code32 == 6553705) {
|
|
175
|
+
store<u32>(changetype<usize>(out), JSON.__deserialize<u32>(lastIndex, srcStart), offsetof<this>("id"));
|
|
176
|
+
srcStart += 2;
|
|
177
|
+
keyStart = 0;
|
|
178
|
+
break;
|
|
179
|
+
} else {
|
|
180
|
+
srcStart += 2;
|
|
181
|
+
keyStart = 0;
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
case 8: {
|
|
187
|
+
const code64 = load<u64>(keyStart);
|
|
188
|
+
if ((isInteger<T>() || isFloat<T>()) && code64 == 27303570963497060) {
|
|
189
|
+
store<T>(changetype<usize>(out), JSON.__deserialize<T>(lastIndex, srcStart), offsetof<this>("data"));
|
|
190
|
+
srcStart += 2;
|
|
191
|
+
keyStart = 0;
|
|
192
|
+
break;
|
|
193
|
+
} else {
|
|
194
|
+
srcStart += 2;
|
|
195
|
+
keyStart = 0;
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
default: {
|
|
201
|
+
srcStart += 2;
|
|
202
|
+
keyStart = 0;
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
srcStart += 2;
|
|
209
|
+
}
|
|
210
|
+
} else if (code == 123) {
|
|
211
|
+
lastIndex = srcStart;
|
|
212
|
+
depth++;
|
|
213
|
+
srcStart += 2;
|
|
214
|
+
while (srcStart < srcEnd) {
|
|
215
|
+
const code = load<u16>(srcStart);
|
|
216
|
+
if (code == 34) {
|
|
217
|
+
srcStart += 2;
|
|
218
|
+
while (!(load<u16>(srcStart) == 34 && load<u16>(srcStart - 2) != 92)) srcStart += 2;
|
|
219
|
+
} else if (code == 125) {
|
|
220
|
+
if (--depth == 0) {
|
|
221
|
+
srcStart += 2;
|
|
222
|
+
console.log("Value (object, 10): " + JSON.Util.ptrToStr(lastIndex, srcStart));
|
|
223
|
+
switch (<u32>keyEnd - <u32>keyStart) {
|
|
224
|
+
case 8: {
|
|
225
|
+
const code64 = load<u64>(keyStart);
|
|
226
|
+
if (isDefined(out.__DESERIALIZE) && code64 == 27303570963497060) {
|
|
227
|
+
store<T>(changetype<usize>(out), JSON.__deserialize<T>(lastIndex, srcStart), offsetof<this>("data"));
|
|
228
|
+
keyStart = 0;
|
|
229
|
+
break;
|
|
230
|
+
} else {
|
|
231
|
+
keyStart = 0;
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
default: {
|
|
237
|
+
keyStart = 0;
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
} else if (code == 123) depth++;
|
|
244
|
+
srcStart += 2;
|
|
245
|
+
}
|
|
246
|
+
} else if (code == 91) {
|
|
247
|
+
lastIndex = srcStart;
|
|
248
|
+
depth++;
|
|
249
|
+
srcStart += 2;
|
|
250
|
+
while (srcStart < srcEnd) {
|
|
251
|
+
const code = load<u16>(srcStart);
|
|
252
|
+
if (code == 34) {
|
|
253
|
+
srcStart += 2;
|
|
254
|
+
while (!(load<u16>(srcStart) == 34 && load<u16>(srcStart - 2) != 92)) srcStart += 2;
|
|
255
|
+
} else if (code == 93) {
|
|
256
|
+
if (--depth == 0) {
|
|
257
|
+
srcStart += 2;
|
|
258
|
+
console.log("Value (object, 11): " + JSON.Util.ptrToStr(lastIndex, srcStart));
|
|
259
|
+
switch (<u32>keyEnd - <u32>keyStart) {
|
|
260
|
+
case 8: {
|
|
261
|
+
const code64 = load<u64>(keyStart);
|
|
262
|
+
if (isArray<T>() && code64 == 27303570963497060) {
|
|
263
|
+
store<T>(changetype<usize>(out), JSON.__deserialize<T>(lastIndex, srcStart), offsetof<this>("data"));
|
|
264
|
+
keyStart = 0;
|
|
265
|
+
break;
|
|
266
|
+
} else {
|
|
267
|
+
keyStart = 0;
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
default: {
|
|
273
|
+
keyStart = 0;
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
} else if (code == 91) depth++;
|
|
280
|
+
srcStart += 2;
|
|
281
|
+
}
|
|
282
|
+
} else if (code == 116) {
|
|
283
|
+
if (load<u64>(srcStart) == 28429475166421108) {
|
|
284
|
+
srcStart += 8;
|
|
285
|
+
console.log("Value (bool, 12): " + JSON.Util.ptrToStr(lastIndex, srcStart - 8));
|
|
286
|
+
switch (<u32>keyEnd - <u32>keyStart) {
|
|
287
|
+
case 8: {
|
|
288
|
+
const code64 = load<u64>(keyStart);
|
|
289
|
+
if (isBoolean<T>() && code64 == 27303570963497060) {
|
|
290
|
+
store<boolean>(changetype<usize>(out), true, offsetof<this>("data"));
|
|
291
|
+
srcStart += 2;
|
|
292
|
+
keyStart = 0;
|
|
293
|
+
break;
|
|
294
|
+
} else {
|
|
295
|
+
srcStart += 2;
|
|
296
|
+
keyStart = 0;
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
default: {
|
|
302
|
+
srcStart += 2;
|
|
303
|
+
keyStart = 0;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
} else {
|
|
307
|
+
throw new Error("Expected to find 'true' but found '" + JSON.Util.ptrToStr(lastIndex, srcStart) + "' instead at position " + (srcEnd - srcStart).toString());
|
|
308
|
+
}
|
|
309
|
+
} else if (code == 102) {
|
|
310
|
+
if (load<u64>(srcStart, 2) == 28429466576093281) {
|
|
311
|
+
srcStart += 10;
|
|
312
|
+
console.log("Value (bool, 13): " + JSON.Util.ptrToStr(lastIndex, srcStart - 10));
|
|
313
|
+
switch (<u32>keyEnd - <u32>keyStart) {
|
|
314
|
+
case 8: {
|
|
315
|
+
const code64 = load<u64>(keyStart);
|
|
316
|
+
if (isBoolean<T>() && code64 == 27303570963497060) {
|
|
317
|
+
store<boolean>(changetype<usize>(out), false, offsetof<this>("data"));
|
|
318
|
+
srcStart += 2;
|
|
319
|
+
keyStart = 0;
|
|
320
|
+
break;
|
|
321
|
+
} else {
|
|
322
|
+
srcStart += 2;
|
|
323
|
+
keyStart = 0;
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
default: {
|
|
329
|
+
srcStart += 2;
|
|
330
|
+
keyStart = 0;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
} else {
|
|
334
|
+
throw new Error("Expected to find 'false' but found '" + JSON.Util.ptrToStr(lastIndex, srcStart) + "' instead at position " + (srcEnd - srcStart).toString());
|
|
335
|
+
}
|
|
336
|
+
} else if (code == 110) {
|
|
337
|
+
if (load<u64>(srcStart) == 30399761348886638) {
|
|
338
|
+
srcStart += 8;
|
|
339
|
+
console.log("Value (null, 14): " + JSON.Util.ptrToStr(lastIndex, srcStart - 8));
|
|
340
|
+
switch (<u32>keyEnd - <u32>keyStart) {
|
|
341
|
+
case 8: {
|
|
342
|
+
const code64 = load<u64>(keyStart);
|
|
343
|
+
if (isNullable<T>() && code64 == 27303570963497060) {
|
|
344
|
+
store<usize>(changetype<usize>(out), 0, offsetof<this>("data"));
|
|
345
|
+
srcStart += 2;
|
|
346
|
+
keyStart = 0;
|
|
347
|
+
break;
|
|
348
|
+
} else {
|
|
349
|
+
srcStart += 2;
|
|
350
|
+
keyStart = 0;
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
default: {
|
|
356
|
+
srcStart += 2;
|
|
357
|
+
keyStart = 0;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
} else {
|
|
362
|
+
srcStart += 2;
|
|
363
|
+
keyStart = 0;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return out;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
const enumValue = GenericEnum.create<string>("success", "Hello World");
|
|
371
|
+
const node = new Node<GenericEnum<string>>();
|
|
372
|
+
node.name = "test-node";
|
|
373
|
+
node.id = 42;
|
|
374
|
+
node.data = enumValue;
|
|
375
|
+
const serialized = JSON.stringify(node);
|
|
376
|
+
console.log("Serialized Node: " + serialized);
|
|
377
|
+
const deserialized = JSON.parse<Node<GenericEnum<string>>>(serialized);
|
|
378
|
+
console.log("Deserialized Node: " + JSON.stringify(deserialized));
|
package/assembly/test.ts
CHANGED
|
@@ -1,33 +1,76 @@
|
|
|
1
1
|
import { JSON } from ".";
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
@json
|
|
5
|
+
class GenericEnum<T> {
|
|
6
|
+
private tag: string = "";
|
|
7
|
+
private value: T | null = null;
|
|
8
|
+
|
|
9
|
+
constructor() {
|
|
10
|
+
this.tag = "";
|
|
11
|
+
this.value = null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
static create<T>(tag: string, value: T): GenericEnum<T> {
|
|
15
|
+
const item = new GenericEnum<T>();
|
|
16
|
+
item.tag = tag;
|
|
17
|
+
item.value = value;
|
|
18
|
+
return item;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
getTag(): string {
|
|
22
|
+
return this.tag;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
getValue(): T | null {
|
|
26
|
+
return this.value;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@serializer
|
|
30
|
+
serialize<T>(self: GenericEnum<T>): string {
|
|
31
|
+
const tagJson = JSON.stringify(self.tag);
|
|
32
|
+
const valueJson = JSON.stringify(self.value);
|
|
33
|
+
return `{${tagJson}:${valueJson}}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@deserializer
|
|
37
|
+
deserialize(data: string): GenericEnum<T> {
|
|
38
|
+
const parsed = JSON.parse<Map<string, JSON.Raw>>(data);
|
|
39
|
+
const result = new GenericEnum<T>();
|
|
40
|
+
|
|
41
|
+
const keys = parsed.keys();
|
|
42
|
+
const values = parsed.values();
|
|
43
|
+
|
|
44
|
+
result.tag = keys[0];
|
|
45
|
+
result.value = JSON.parse<T>(values[0].data);
|
|
46
|
+
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
3
51
|
|
|
4
52
|
@json
|
|
5
|
-
class
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
53
|
+
class Node<T> {
|
|
54
|
+
name: string;
|
|
55
|
+
id: u32;
|
|
56
|
+
data: T;
|
|
57
|
+
|
|
58
|
+
constructor() {
|
|
59
|
+
this.name = "";
|
|
60
|
+
this.id = 0;
|
|
61
|
+
this.data = changetype<T>(0);
|
|
62
|
+
}
|
|
15
63
|
}
|
|
16
64
|
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const serialized = JSON.stringify(player);
|
|
31
|
-
console.log("Serialized: " + serialized);
|
|
32
|
-
const deserialized = JSON.parse<Player>(serialized);
|
|
33
|
-
console.log("Deserialized: " + JSON.stringify(deserialized))
|
|
65
|
+
const enumValue = GenericEnum.create<string>("success", "Hello World");
|
|
66
|
+
|
|
67
|
+
const node = new Node<GenericEnum<string>>();
|
|
68
|
+
node.name = "test-node";
|
|
69
|
+
node.id = 42;
|
|
70
|
+
node.data = enumValue;
|
|
71
|
+
|
|
72
|
+
const serialized = JSON.stringify(node);
|
|
73
|
+
console.log("Serialized Node: " + serialized);
|
|
74
|
+
|
|
75
|
+
const deserialized = JSON.parse<Node<GenericEnum<string>>>(serialized);
|
|
76
|
+
console.log("Deserialized Node: " + JSON.stringify(deserialized));
|
package/assembly/types.ts
CHANGED
|
@@ -1,35 +1,40 @@
|
|
|
1
|
-
import { JSON } from "."
|
|
1
|
+
import { JSON } from ".";
|
|
2
|
+
|
|
2
3
|
|
|
3
4
|
@json
|
|
4
5
|
export class GenericEnum<T> {
|
|
5
|
-
private tag: string = ""
|
|
6
|
-
private value: T | null = null
|
|
6
|
+
private tag: string = "";
|
|
7
|
+
private value: T | null = null;
|
|
7
8
|
|
|
8
9
|
constructor() {
|
|
9
|
-
this.tag = ""
|
|
10
|
-
this.value = null
|
|
10
|
+
this.tag = "";
|
|
11
|
+
this.value = null;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
static create<T>(tag: string, value: T): GenericEnum<T> {
|
|
14
|
-
const item = new GenericEnum<T>()
|
|
15
|
-
item.tag = tag
|
|
16
|
-
item.value = value
|
|
17
|
-
return item
|
|
15
|
+
const item = new GenericEnum<T>();
|
|
16
|
+
item.tag = tag;
|
|
17
|
+
item.value = value;
|
|
18
|
+
return item;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
getTag(): string {
|
|
21
|
-
return this.tag
|
|
22
|
+
return this.tag;
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
getValue(): T | null {
|
|
25
|
-
return this.value
|
|
26
|
+
return this.value;
|
|
26
27
|
}
|
|
28
|
+
|
|
29
|
+
|
|
27
30
|
@serializer
|
|
28
31
|
serialize<T>(self: GenericEnum<T>): string {
|
|
29
32
|
const tagJson = JSON.stringify(self.tag);
|
|
30
33
|
const valueJson = JSON.stringify(self.value);
|
|
31
|
-
return `{${tagJson}:${valueJson}}
|
|
34
|
+
return `{${tagJson}:${valueJson}}`;
|
|
32
35
|
}
|
|
36
|
+
|
|
37
|
+
|
|
33
38
|
@deserializer
|
|
34
39
|
deserialize(data: string): GenericEnum<T> {
|
|
35
40
|
const parsed = JSON.parse<Map<string, JSON.Raw>>(data);
|
|
@@ -45,19 +50,21 @@ export class GenericEnum<T> {
|
|
|
45
50
|
}
|
|
46
51
|
}
|
|
47
52
|
|
|
53
|
+
|
|
48
54
|
@json
|
|
49
55
|
export class Node<T> {
|
|
50
|
-
name: string
|
|
51
|
-
id: u32
|
|
52
|
-
data: T
|
|
56
|
+
name: string;
|
|
57
|
+
id: u32;
|
|
58
|
+
data: T;
|
|
53
59
|
|
|
54
60
|
constructor() {
|
|
55
|
-
this.name = ""
|
|
56
|
-
this.id = 0
|
|
61
|
+
this.name = "";
|
|
62
|
+
this.id = 0;
|
|
57
63
|
this.data = changetype<T>(0);
|
|
58
64
|
}
|
|
59
65
|
}
|
|
60
66
|
|
|
67
|
+
|
|
61
68
|
@json
|
|
62
69
|
export class Vec3 {
|
|
63
70
|
x: f32 = 0.0;
|
|
@@ -65,5 +72,6 @@ export class Vec3 {
|
|
|
65
72
|
z: f32 = 0.0;
|
|
66
73
|
}
|
|
67
74
|
|
|
75
|
+
|
|
68
76
|
@json
|
|
69
|
-
export class Point {
|
|
77
|
+
export class Point {}
|