alex

/

v Public
0 Issues 1 Contributor 0 Releases 4 Branches
Additions: 45 Deletions: 15 View patch
1 // e.encode_array(val[i], level + 1, mut wr)!
2 } $else $if U is $Struct {
3 e.encode_struct(val[i], level + 1, mut wr)!
4+ } $else $if U is $Sumtype {
5+ $if U is Any {
6+ e.encode_any(val[i], level + 1, mut wr)!
7+ } $else {
8+ // TODO
9+ }
10 } $else $if U is $Enum {
11 e.encode_any(i64(val[i]), level + 1, mut wr)!
12 } $else {
13
1 import x.json2 as json
2 import strings
3
4+struct StructType[T] {
5+mut:
6+ val T
7+}
8+
9 fn test_json_string_characters() {
10 text := json.raw_decode(r'"\n\r\b\f\t\\\"\/"') or { '' }
11 assert text.json_str() == '"\\n\\r\\b\\f\\t\\\\\\"\\/"'
12 }
13
14 fn test_encode_array() {
15- assert json.encode([1, 2, 3]) == '[1,2,3]'
16+ array_of_struct := [StructType[[]bool]{
17+ val: [false, true]
18+ }, StructType[[]bool]{
19+ val: [true, false]
20+ }]
21+
22+ assert json.encode_array([1, 2, 3]) == '[1,2,3]'
23+
24+ assert json.encode_array(array_of_struct) == '[{"val":[false,true]},{"val":[true,false]}]'
25 }
26
27 fn test_encode_simple() {
28
1
2 // encode is a generic function that encodes a type into a JSON string.
3 pub fn encode[T](val T) string {
4+ $if T is $Array {
5+ $compile_error('Cannot use `json.encode` to encode array. Try `json.encode_array` instead')
6+ }
7 mut sb := strings.new_builder(64)
8+
9 defer {
10 unsafe { sb.free() }
11 }
12- $if T is $Array {
13- mut array_of_any := []Any{}
14- for value in val {
15- array_of_any << value
16- }
17- default_encoder.encode_value(array_of_any, mut sb) or {
18- dump(err)
19- default_encoder.encode_value[Null](null, mut sb) or {}
20- }
21- } $else {
22- default_encoder.encode_value(val, mut sb) or {
23- dump(err)
24- default_encoder.encode_value[Null](null, mut sb) or {}
25- }
26+
27+ default_encoder.encode_value(val, mut sb) or {
28+ dump(err)
29+ default_encoder.encode_value[Null](null, mut sb) or {}
30+ }
31+
32+ return sb.str()
33+}
34+
35+// encode_array is a generic function that encodes a array into a JSON string.
36+pub fn encode_array[T](val []T) string {
37+ mut sb := strings.new_builder(64)
38+
39+ defer {
40+ unsafe { sb.free() }
41 }
42+
43+ default_encoder.encode_array(val, 1, mut sb) or {
44+ dump(err)
45+ default_encoder.encode_value[Null](null, mut sb) or {}
46+ }
47+
48 return sb.str()
49 }
50