Skip to content

Commit d970d45

Browse files
authored
x.json2: remove workaround_cast(), add isize usize decode support (#26210)
1 parent 087a1c2 commit d970d45

3 files changed

Lines changed: 56 additions & 21 deletions

File tree

‎vlib/x/json2/decode.v‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,10 @@ fn (mut decoder Decoder) decode_number[T](val &T) ! {
876876
u32 { *val = strconv.atou32(str)! }
877877
u64 { *val = strconv.atou64(str)! }
878878
int { *val = strconv.atoi(str)! }
879-
$float { *val = T(strconv.atof_quick(str)) }
879+
isize { *val = isize(strconv.atoi64(str)!) }
880+
usize { *val = usize(strconv.atou64(str)!) }
881+
f32 { *val = f32(strconv.atof_quick(str)) }
882+
f64 { *val = strconv.atof_quick(str) }
880883
$else { return error('`decode_number` can not decode ${T.name} type') }
881884
}
882885
}

‎vlib/x/json2/encode.v‎

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,6 @@ mut:
2222
output []u8 = []u8{cap: 2048}
2323
}
2424

25-
@[inline]
26-
fn workaround_cast[T](val voidptr) T {
27-
return *(&T(val))
28-
}
29-
3025
// encode is a generic function that encodes a type into a JSON string.
3126
pub fn encode[T](val T, config EncoderOptions) string {
3227
mut encoder := Encoder{
@@ -40,33 +35,33 @@ pub fn encode[T](val T, config EncoderOptions) string {
4035

4136
fn (mut encoder Encoder) encode_value[T](val T) {
4237
$if T.unaliased_typ is string {
43-
encoder.encode_string(workaround_cast[string](&val))
38+
encoder.encode_string(string(val))
4439
} $else $if T.unaliased_typ is bool {
45-
encoder.encode_boolean(workaround_cast[bool](&val))
40+
encoder.encode_boolean(bool(val))
4641
} $else $if T.unaliased_typ is u8 {
47-
encoder.encode_number(workaround_cast[u8](&val))
42+
encoder.encode_number(u8(val))
4843
} $else $if T.unaliased_typ is u16 {
49-
encoder.encode_number(workaround_cast[u16](&val))
44+
encoder.encode_number(u16(val))
5045
} $else $if T.unaliased_typ is u32 {
51-
encoder.encode_number(workaround_cast[u32](&val))
46+
encoder.encode_number(u32(val))
5247
} $else $if T.unaliased_typ is u64 {
53-
encoder.encode_number(workaround_cast[u64](&val))
48+
encoder.encode_number(u64(val))
5449
} $else $if T.unaliased_typ is i8 {
55-
encoder.encode_number(workaround_cast[i8](&val))
50+
encoder.encode_number(i8(val))
5651
} $else $if T.unaliased_typ is i16 {
57-
encoder.encode_number(workaround_cast[i16](&val))
52+
encoder.encode_number(i16(val))
5853
} $else $if T.unaliased_typ is int || T.unaliased_typ is i32 {
59-
encoder.encode_number(workaround_cast[int](&val))
54+
encoder.encode_number(i32(val))
6055
} $else $if T.unaliased_typ is i64 {
61-
encoder.encode_number(workaround_cast[i64](&val))
56+
encoder.encode_number(i64(val))
6257
} $else $if T.unaliased_typ is usize {
63-
encoder.encode_number(workaround_cast[usize](&val))
58+
encoder.encode_number(usize(val))
6459
} $else $if T.unaliased_typ is isize {
65-
encoder.encode_number(workaround_cast[isize](&val))
60+
encoder.encode_number(isize(val))
6661
} $else $if T.unaliased_typ is f32 {
67-
encoder.encode_number(workaround_cast[f32](&val))
62+
encoder.encode_number(f32(val))
6863
} $else $if T.unaliased_typ is f64 {
69-
encoder.encode_number(workaround_cast[f64](&val))
64+
encoder.encode_number(f64(val))
7065
} $else $if T.unaliased_typ is $array {
7166
encoder.encode_array(val)
7267
} $else $if T.unaliased_typ is $map {
@@ -293,7 +288,7 @@ fn (mut encoder Encoder) encode_map[T](val map[string]T) {
293288

294289
fn (mut encoder Encoder) encode_enum[T](val T) {
295290
if encoder.enum_as_int {
296-
encoder.encode_number(workaround_cast[int](&val))
291+
encoder.encode_number(int(val))
297292
} else {
298293
mut enum_val := val.str()
299294
$if val is $alias {

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,19 @@ const fixed_time = time.new(
1212

1313
type StringAlias = string
1414
type BoolAlias = bool
15+
type U8Alias = u8
16+
type U16Alias = u16
17+
type U32Alias = u32
18+
type U64Alias = u64
19+
type I8Alias = i8
20+
type I16Alias = i16
21+
type I32Alias = i32
22+
type I64Alias = i64
1523
type IntAlias = int
24+
type UsizeAlias = usize
25+
type IsizeAlias = isize
26+
type F32Alias = f32
27+
type F64Alias = f64
1628
type TimeAlias = time.Time
1729
type StructAlias = StructType[int]
1830
type EnumAlias = Enumerates
@@ -316,3 +328,28 @@ fn test_maps() {
316328
}
317329
}) == '{"val":{"a":{"1":1}}}'
318330
}
331+
332+
struct AliasStruct {
333+
f_string StringAlias = 'hello'
334+
f_bool BoolAlias = true
335+
f_u8 U8Alias = 123
336+
f_u16 U16Alias = 456
337+
f_u32 U32Alias = 789
338+
f_u64 U64Alias = 112233
339+
f_i8 I8Alias = -123
340+
f_i16 I16Alias = -456
341+
f_i32 I32Alias = -789
342+
f_i64 I64Alias = -112233
343+
f_int IntAlias = 7788
344+
f_usize UsizeAlias = 9900
345+
f_isize IsizeAlias = -9900
346+
f_f32 F32Alias = -1.5
347+
f_f64 F64Alias = 7.25
348+
}
349+
350+
fn test_struct_alias() {
351+
s := AliasStruct{}
352+
str := json.encode(s)
353+
assert str == '{"f_string":"hello","f_bool":true,"f_u8":123,"f_u16":456,"f_u32":789,"f_u64":112233,"f_i8":-123,"f_i16":-456,"f_i32":-789,"f_i64":-112233,"f_int":7788,"f_usize":9900,"f_isize":-9900,"f_f32":-1.5,"f_f64":7.25}'
354+
assert json.decode[AliasStruct](str)! == s
355+
}

0 commit comments

Comments
 (0)