Skip to content

Commit 1f8f6d0

Browse files
authored
x.json2: add u16(),u32() (fix #24337) (#24342)
1 parent 19be228 commit 1f8f6d0

3 files changed

Lines changed: 272 additions & 25 deletions

File tree

‎vlib/x/json2/encoder.v‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,8 @@ fn (e &Encoder) encode_value_with_level[T](val T, level int, mut buf []u8) ! {
186186
} $else $if T is $enum {
187187
str_int := int(val).str()
188188
unsafe { buf.push_many(str_int.str, str_int.len) }
189-
} $else $if T is $int || T is bool {
189+
} $else $if T is $int || T is bool || T is i32 {
190+
// bug? `i32` not in `$int`?
190191
str_int := val.str()
191192
unsafe { buf.push_many(str_int.str, str_int.len) }
192193
} $else $if T is $float {

‎vlib/x/json2/json2.v‎

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ pub fn (f Any) u8() u8 {
101101
u8 {
102102
return f
103103
}
104-
u16, u32, i8, i16, i32, int, i64, f32, f64, bool {
104+
u16, u32, u64, i8, i16, i32, int, i64, f32, f64, bool {
105105
return u8(u16(f))
106106
}
107107
string {
@@ -113,6 +113,42 @@ pub fn (f Any) u8() u8 {
113113
}
114114
}
115115

116+
// u16 uses `Any` as a 16-bit unsigned integer.
117+
pub fn (f Any) u16() u16 {
118+
match f {
119+
u16 {
120+
return f
121+
}
122+
u8, u32, u64, i8, i16, i32, int, i64, f32, f64, bool {
123+
return u16(f)
124+
}
125+
string {
126+
return f.u16()
127+
}
128+
else {
129+
return 0
130+
}
131+
}
132+
}
133+
134+
// u32 uses `Any` as a 32-bit unsigned integer.
135+
pub fn (f Any) u32() u32 {
136+
match f {
137+
u32 {
138+
return f
139+
}
140+
u8, u16, u64, i8, i16, i32, int, i64, f32, f64, bool {
141+
return u32(f)
142+
}
143+
string {
144+
return f.u32()
145+
}
146+
else {
147+
return 0
148+
}
149+
}
150+
}
151+
116152
// u64 uses `Any` as a 64-bit unsigned integer.
117153
pub fn (f Any) u64() u64 {
118154
match f {

‎vlib/x/json2/tests/any_test.v‎

Lines changed: 233 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
import x.json2 as json
22

33
const sample_data = {
4-
'int': json.Any(int(1))
5-
'i64': json.Any(i64(128))
6-
'f32': json.Any(f32(2.0))
4+
'u8': json.Any(u8(1))
5+
'u16': json.Any(u16(2))
6+
'u32': json.Any(u32(3))
7+
'u64': json.Any(u64(4))
8+
'i8': json.Any(i8(5))
9+
'i16': json.Any(i16(6))
10+
'i32': json.Any(i32(7))
11+
'int': json.Any(int(8))
12+
'i64': json.Any(i64(9))
13+
'f32': json.Any(f32(2.3))
714
'f64': json.Any(f64(1.283))
815
'bool': json.Any(false)
916
'str': json.Any('test')
@@ -23,9 +30,16 @@ fn is_null(f json.Any) bool {
2330

2431
fn test_f32() {
2532
// valid conversions
26-
assert sample_data['int'] or { 0 }.f32() == 1.0
27-
assert sample_data['i64'] or { 0 }.f32() == 128.0
28-
assert sample_data['f32'] or { 0 }.f32() == 2.0
33+
assert sample_data['u8'] or { 0 }.f32() == 1.0
34+
assert sample_data['u16'] or { 0 }.f32() == 2.0
35+
assert sample_data['u32'] or { 0 }.f32() == 3.0
36+
assert sample_data['u64'] or { 0 }.f32() == 4.0
37+
assert sample_data['i8'] or { 0 }.f32() == 5.0
38+
assert sample_data['i16'] or { 0 }.f32() == 6.0
39+
assert sample_data['i32'] or { 0 }.f32() == 7.0
40+
assert sample_data['int'] or { 0 }.f32() == 8.0
41+
assert sample_data['i64'] or { 0 }.f32() == 9.0
42+
assert sample_data['f32'] or { 0 }.f32() == 2.3
2943
assert sample_data['f64'] or { 0 }.f32() == 1.2829999923706055
3044
// invalid conversions
3145
assert sample_data['bool'] or { 0 }.f32() == 0.0
@@ -37,9 +51,16 @@ fn test_f32() {
3751

3852
fn test_f64() {
3953
// valid conversions
40-
assert sample_data['int'] or { 0 }.f64() == 1.0
41-
assert sample_data['i64'] or { 0 }.f64() == 128.0
42-
assert sample_data['f32'] or { 0 }.f64() == 2.0
54+
assert sample_data['u8'] or { 0 }.f64() == 1.0
55+
assert sample_data['u16'] or { 0 }.f64() == 2.0
56+
assert sample_data['u32'] or { 0 }.f64() == 3.0
57+
assert sample_data['u64'] or { 0 }.f64() == 4.0
58+
assert sample_data['i8'] or { 0 }.f64() == 5.0
59+
assert sample_data['i16'] or { 0 }.f64() == 6.0
60+
assert sample_data['i32'] or { 0 }.f64() == 7.0
61+
assert sample_data['int'] or { 0 }.f64() == 8.0
62+
assert sample_data['i64'] or { 0 }.f64() == 9.0
63+
assert sample_data['f32'] or { 0 }.f64() == 2.299999952316284
4364
assert sample_data['f64'] or { 0 }.f64() == 1.283
4465
// invalid conversions
4566
assert sample_data['bool'] or { 0 }.f64() == 0.0
@@ -49,10 +70,80 @@ fn test_f64() {
4970
assert sample_data['obj'] or { 0 }.f64() == 0.0
5071
}
5172

73+
fn test_i8() {
74+
// valid conversions
75+
assert sample_data['u8'] or { 0 }.i8() == 1
76+
assert sample_data['u16'] or { 0 }.i8() == 2
77+
assert sample_data['u32'] or { 0 }.i8() == 3
78+
assert sample_data['u64'] or { 0 }.i8() == 4
79+
assert sample_data['i8'] or { 0 }.i8() == 5
80+
assert sample_data['i16'] or { 0 }.i8() == 6
81+
assert sample_data['i32'] or { 0 }.i8() == 7
82+
assert sample_data['int'] or { 0 }.i8() == 8
83+
assert sample_data['i64'] or { 0 }.i8() == 9
84+
assert sample_data['f32'] or { 0 }.i8() == 2
85+
assert sample_data['f64'] or { 0 }.i8() == 1
86+
assert json.Any(true).i8() == 1
87+
assert json.Any('123').i8() == 123
88+
// invalid conversions
89+
assert sample_data['null'] or { 0 }.i8() == 0
90+
assert sample_data['arr'] or { 0 }.i8() == 0
91+
assert sample_data['obj'] or { 0 }.i8() == 0
92+
}
93+
94+
fn test_i16() {
95+
// valid conversions
96+
assert sample_data['u8'] or { 0 }.i16() == 1
97+
assert sample_data['u16'] or { 0 }.i16() == 2
98+
assert sample_data['u32'] or { 0 }.i16() == 3
99+
assert sample_data['u64'] or { 0 }.i16() == 4
100+
assert sample_data['i8'] or { 0 }.i16() == 5
101+
assert sample_data['i16'] or { 0 }.i16() == 6
102+
assert sample_data['i32'] or { 0 }.i16() == 7
103+
assert sample_data['int'] or { 0 }.i16() == 8
104+
assert sample_data['i64'] or { 0 }.i16() == 9
105+
assert sample_data['f32'] or { 0 }.i16() == 2
106+
assert sample_data['f64'] or { 0 }.i16() == 1
107+
assert json.Any(true).i16() == 1
108+
assert json.Any('123').i16() == 123
109+
// invalid conversions
110+
assert sample_data['null'] or { 0 }.i16() == 0
111+
assert sample_data['arr'] or { 0 }.i16() == 0
112+
assert sample_data['obj'] or { 0 }.i16() == 0
113+
}
114+
115+
fn test_i32() {
116+
// valid conversions
117+
assert sample_data['u8'] or { 0 }.i32() == 1
118+
assert sample_data['u16'] or { 0 }.i32() == 2
119+
assert sample_data['u32'] or { 0 }.i32() == 3
120+
assert sample_data['u64'] or { 0 }.i32() == 4
121+
assert sample_data['i8'] or { 0 }.i32() == 5
122+
assert sample_data['i16'] or { 0 }.i32() == 6
123+
assert sample_data['i32'] or { 0 }.i32() == 7
124+
assert sample_data['int'] or { 0 }.i32() == 8
125+
assert sample_data['i64'] or { 0 }.i32() == 9
126+
assert sample_data['f32'] or { 0 }.i32() == 2
127+
assert sample_data['f64'] or { 0 }.i32() == 1
128+
assert json.Any(true).i32() == 1
129+
assert json.Any('123').i32() == 123
130+
// invalid conversions
131+
assert sample_data['null'] or { 0 }.i32() == 0
132+
assert sample_data['arr'] or { 0 }.i32() == 0
133+
assert sample_data['obj'] or { 0 }.i32() == 0
134+
}
135+
52136
fn test_int() {
53137
// valid conversions
54-
assert sample_data['int'] or { 0 }.int() == 1
55-
assert sample_data['i64'] or { 0 }.int() == 128
138+
assert sample_data['u8'] or { 0 }.int() == 1
139+
assert sample_data['u16'] or { 0 }.int() == 2
140+
assert sample_data['u32'] or { 0 }.int() == 3
141+
assert sample_data['u64'] or { 0 }.int() == 4
142+
assert sample_data['i8'] or { 0 }.int() == 5
143+
assert sample_data['i16'] or { 0 }.int() == 6
144+
assert sample_data['i32'] or { 0 }.int() == 7
145+
assert sample_data['int'] or { 0 }.int() == 8
146+
assert sample_data['i64'] or { 0 }.int() == 9
56147
assert sample_data['f32'] or { 0 }.int() == 2
57148
assert sample_data['f64'] or { 0 }.int() == 1
58149
assert json.Any(true).int() == 1
@@ -65,8 +156,15 @@ fn test_int() {
65156

66157
fn test_i64() {
67158
// valid conversions
68-
assert sample_data['int'] or { 0 }.i64() == 1
69-
assert sample_data['i64'] or { 0 }.i64() == 128
159+
assert sample_data['u8'] or { 0 }.i64() == 1
160+
assert sample_data['u16'] or { 0 }.i64() == 2
161+
assert sample_data['u32'] or { 0 }.i64() == 3
162+
assert sample_data['u64'] or { 0 }.i64() == 4
163+
assert sample_data['i8'] or { 0 }.i64() == 5
164+
assert sample_data['i16'] or { 0 }.i64() == 6
165+
assert sample_data['i32'] or { 0 }.i64() == 7
166+
assert sample_data['int'] or { 0 }.i64() == 8
167+
assert sample_data['i64'] or { 0 }.i64() == 9
70168
assert sample_data['f32'] or { 0 }.i64() == 2
71169
assert sample_data['f64'] or { 0 }.i64() == 1
72170
assert json.Any(true).i64() == 1
@@ -77,10 +175,101 @@ fn test_i64() {
77175
assert sample_data['obj'] or { 0 }.i64() == 0
78176
}
79177

178+
fn test_u8() {
179+
// valid conversions
180+
assert sample_data['u8'] or { 0 }.u8() == 1
181+
assert sample_data['u16'] or { 0 }.u8() == 2
182+
assert sample_data['u32'] or { 0 }.u8() == 3
183+
assert sample_data['u64'] or { 0 }.u8() == 4
184+
assert sample_data['i8'] or { 0 }.u8() == 5
185+
assert sample_data['i16'] or { 0 }.u8() == 6
186+
assert sample_data['i32'] or { 0 }.u8() == 7
187+
assert sample_data['int'] or { 0 }.u8() == 8
188+
assert sample_data['i64'] or { 0 }.u8() == 9
189+
assert sample_data['f32'] or { 0 }.u8() == 2
190+
assert sample_data['f64'] or { 0 }.u8() == 1
191+
assert json.Any(true).u8() == 1
192+
assert json.Any('123').u8() == 123
193+
// invalid conversions
194+
assert sample_data['null'] or { 0 }.u8() == 0
195+
assert sample_data['arr'] or { 0 }.u8() == 0
196+
assert sample_data['obj'] or { 0 }.u8() == 0
197+
}
198+
199+
fn test_u16() {
200+
// valid conversions
201+
assert sample_data['u8'] or { 0 }.u16() == 1
202+
assert sample_data['u16'] or { 0 }.u16() == 2
203+
assert sample_data['u32'] or { 0 }.u16() == 3
204+
assert sample_data['u64'] or { 0 }.u16() == 4
205+
assert sample_data['i8'] or { 0 }.u16() == 5
206+
assert sample_data['i16'] or { 0 }.u16() == 6
207+
assert sample_data['i32'] or { 0 }.u16() == 7
208+
assert sample_data['int'] or { 0 }.u16() == 8
209+
assert sample_data['i64'] or { 0 }.u16() == 9
210+
assert sample_data['f32'] or { 0 }.u16() == 2
211+
assert sample_data['f64'] or { 0 }.u16() == 1
212+
assert json.Any(true).u16() == 1
213+
assert json.Any('123').u16() == 123
214+
// invalid conversions
215+
assert sample_data['null'] or { 0 }.u16() == 0
216+
assert sample_data['arr'] or { 0 }.u16() == 0
217+
assert sample_data['obj'] or { 0 }.u16() == 0
218+
}
219+
220+
fn test_u32() {
221+
// valid conversions
222+
assert sample_data['u8'] or { 0 }.u32() == 1
223+
assert sample_data['u16'] or { 0 }.u32() == 2
224+
assert sample_data['u32'] or { 0 }.u32() == 3
225+
assert sample_data['u64'] or { 0 }.u32() == 4
226+
assert sample_data['i8'] or { 0 }.u32() == 5
227+
assert sample_data['i16'] or { 0 }.u32() == 6
228+
assert sample_data['i32'] or { 0 }.u32() == 7
229+
assert sample_data['int'] or { 0 }.u32() == 8
230+
assert sample_data['i64'] or { 0 }.u32() == 9
231+
assert sample_data['f32'] or { 0 }.u32() == 2
232+
assert sample_data['f64'] or { 0 }.u32() == 1
233+
assert json.Any(true).u32() == 1
234+
assert json.Any('123').u32() == 123
235+
// invalid conversions
236+
assert sample_data['null'] or { 0 }.u32() == 0
237+
assert sample_data['arr'] or { 0 }.u32() == 0
238+
assert sample_data['obj'] or { 0 }.u32() == 0
239+
}
240+
241+
fn test_u64() {
242+
// valid conversions
243+
assert sample_data['u8'] or { 0 }.u64() == 1
244+
assert sample_data['u16'] or { 0 }.u64() == 2
245+
assert sample_data['u32'] or { 0 }.u64() == 3
246+
assert sample_data['u64'] or { 0 }.u64() == 4
247+
assert sample_data['i8'] or { 0 }.u64() == 5
248+
assert sample_data['i16'] or { 0 }.u64() == 6
249+
assert sample_data['i32'] or { 0 }.u64() == 7
250+
assert sample_data['int'] or { 0 }.u64() == 8
251+
assert sample_data['i64'] or { 0 }.u64() == 9
252+
assert sample_data['f32'] or { 0 }.u64() == 2
253+
assert sample_data['f64'] or { 0 }.u64() == 1
254+
assert json.Any(true).u64() == 1
255+
assert json.Any('123').u64() == 123
256+
// invalid conversions
257+
assert sample_data['null'] or { 0 }.u64() == 0
258+
assert sample_data['arr'] or { 0 }.u64() == 0
259+
assert sample_data['obj'] or { 0 }.u64() == 0
260+
}
261+
80262
fn test_as_map() {
81-
assert sample_data['int'] or { 0 }.as_map()['0'] or { 0 }.int() == 1
82-
assert sample_data['i64'] or { 0 }.as_map()['0'] or { 0 }.i64() == 128.0
83-
assert sample_data['f32'] or { 0 }.as_map()['0'] or { 0 }.f32() == 2.0
263+
assert sample_data['u8'] or { 0 }.as_map()['0'] or { 0 }.u8() == 1
264+
assert sample_data['u16'] or { 0 }.as_map()['0'] or { 0 }.u16() == 2
265+
assert sample_data['u32'] or { 0 }.as_map()['0'] or { 0 }.u32() == 3
266+
assert sample_data['u64'] or { 0 }.as_map()['0'] or { 0 }.u64() == 4
267+
assert sample_data['i8'] or { 0 }.as_map()['0'] or { 0 }.i8() == 5
268+
assert sample_data['i16'] or { 0 }.as_map()['0'] or { 0 }.i16() == 6
269+
assert sample_data['i32'] or { 0 }.as_map()['0'] or { 0 }.i32() == 7
270+
assert sample_data['int'] or { 0 }.as_map()['0'] or { 0 }.int() == 8
271+
assert sample_data['i64'] or { 0 }.as_map()['0'] or { 0 }.i64() == 9
272+
assert sample_data['f32'] or { 0 }.as_map()['0'] or { 0 }.f32() == 2.3
84273
assert sample_data['f64'] or { 0 }.as_map()['0'] or { 0 }.f64() == 1.283
85274
assert sample_data['bool'] or { 0 }.as_map()['0'] or { 0 }.bool() == false
86275
assert sample_data['str'] or { 0 }.as_map()['0'] or { 0 }.str() == 'test'
@@ -99,9 +288,16 @@ fn test_as_map_of_strings() {
99288
}
100289

101290
fn test_arr() {
102-
assert sample_data['int'] or { 0 }.arr()[0].int() == 1
103-
assert sample_data['i64'] or { 0 }.arr()[0].i64() == 128.0
104-
assert sample_data['f32'] or { 0 }.arr()[0].f32() == 2.0
291+
assert sample_data['u8'] or { 0 }.arr()[0].u8() == 1
292+
assert sample_data['u16'] or { 0 }.arr()[0].u16() == 2
293+
assert sample_data['u32'] or { 0 }.arr()[0].u32() == 3
294+
assert sample_data['u64'] or { 0 }.arr()[0].u64() == 4
295+
assert sample_data['i8'] or { 0 }.arr()[0].i8() == 5
296+
assert sample_data['i16'] or { 0 }.arr()[0].i16() == 6
297+
assert sample_data['i32'] or { 0 }.arr()[0].i32() == 7
298+
assert sample_data['int'] or { 0 }.arr()[0].int() == 8
299+
assert sample_data['i64'] or { 0 }.arr()[0].i64() == 9
300+
assert sample_data['f32'] or { 0 }.arr()[0].f32() == 2.3
105301
assert sample_data['f64'] or { 0 }.arr()[0].f64() == 1.283
106302
assert sample_data['bool'] or { 0 }.arr()[0].bool() == false
107303
assert sample_data['str'] or { 0 }.arr()[0].str() == 'test'
@@ -114,6 +310,13 @@ fn test_bool() {
114310
// valid conversions
115311
assert sample_data['bool'] or { 0 }.bool() == false
116312
assert json.Any('true').bool() == true
313+
assert sample_data['u8'] or { 0 }.bool() == true
314+
assert sample_data['u16'] or { 0 }.bool() == true
315+
assert sample_data['u32'] or { 0 }.bool() == true
316+
assert sample_data['u64'] or { 0 }.bool() == true
317+
assert sample_data['i8'] or { 0 }.bool() == true
318+
assert sample_data['i16'] or { 0 }.bool() == true
319+
assert sample_data['i32'] or { 0 }.bool() == true
117320
assert sample_data['int'] or { 0 }.bool() == true
118321
assert sample_data['i64'] or { 0 }.bool() == true
119322
assert sample_data['f32'] or { 0 }.bool() == true
@@ -125,13 +328,20 @@ fn test_bool() {
125328
}
126329

127330
fn test_str() {
128-
assert sample_data['int'] or { 0 }.str() == '1'
129-
assert sample_data['i64'] or { 0 }.str() == '128'
130-
assert sample_data['f32'] or { 0 }.str() == '2'
331+
assert sample_data['u8'] or { 0 }.str() == '1'
332+
assert sample_data['u16'] or { 0 }.str() == '2'
333+
assert sample_data['u32'] or { 0 }.str() == '3'
334+
assert sample_data['u64'] or { 0 }.str() == '4'
335+
assert sample_data['i8'] or { 0 }.str() == '5'
336+
assert sample_data['i16'] or { 0 }.str() == '6'
337+
assert sample_data['i32'] or { 0 }.str() == '7'
338+
assert sample_data['int'] or { 0 }.str() == '8'
339+
assert sample_data['i64'] or { 0 }.str() == '9'
340+
assert sample_data['f32'] or { 0 }.str() == '2.299999952316284'
131341
assert sample_data['f64'] or { 0 }.str() == '1.283'
132342
assert sample_data['bool'] or { 0 }.str() == 'false'
133343
assert sample_data['str'] or { 0 }.str() == 'test'
134344
assert sample_data['null'] or { 0 }.str() == 'null'
135345
assert sample_data['arr'] or { 'not lol' }.str() == '["lol"]'
136-
assert sample_data.str() == '{"int":1,"i64":128,"f32":2,"f64":1.283,"bool":false,"str":"test","null":null,"arr":["lol"],"obj":{"foo":10}}'
346+
assert sample_data.str() == '{"u8":1,"u16":2,"u32":3,"u64":4,"i8":5,"i16":6,"i32":7,"int":8,"i64":9,"f32":2.299999952316284,"f64":1.283,"bool":false,"str":"test","null":null,"arr":["lol"],"obj":{"foo":10}}'
137347
}

0 commit comments

Comments
 (0)