11module json2
22
33import strconv
4+ import time
45
56const null_in_string = 'null'
67
@@ -36,6 +37,7 @@ struct DecoderFieldInfo {
3637 is_raw bool
3738}
3839
40+ @[markused]
3941struct StructFieldInfo {
4042 json_name_ptr voidptr
4143 json_name_len int
@@ -375,15 +377,15 @@ fn (mut decoder Decoder) cached_struct_field_infos[T]() []StructFieldInfo {
375377 return * field_infos
376378}
377379
378- @[inline]
380+ @[inline; markused ]
379381fn struct_field_is_decoded (decoded_mask u64 , decoded_fields []bool , field_idx int ) bool {
380382 if field_idx < 64 {
381383 return (decoded_mask & (u64 (1 ) << u64 (field_idx))) != 0
382384 }
383385 return decoded_fields[field_idx]
384386}
385387
386- @[inline]
388+ @[inline; markused ]
387389fn mark_struct_field_decoded (decoded_mask u64 , mut decoded_fields []bool , field_idx int ) u64 {
388390 if field_idx < 64 {
389391 return decoded_mask | (u64 (1 ) << u64 (field_idx))
@@ -402,7 +404,7 @@ fn (decoder &Decoder) json_key_matches(key_info ValueInfo, key_name string) bool
402404 }
403405}
404406
405- @[inline]
407+ @[inline; markused ]
406408fn (decoder &Decoder) is_empty_value (value_info ValueInfo) bool {
407409 match value_info.value_kind {
408410 .null {
@@ -430,6 +432,7 @@ fn (decoder &Decoder) is_empty_value(value_info ValueInfo) bool {
430432 return false
431433}
432434
435+ @[markused]
433436fn (mut decoder Decoder) skip_current_value () {
434437 if decoder.current_node == unsafe { nil } {
435438 return
@@ -673,6 +676,23 @@ fn (mut decoder Decoder) decode_value[T](mut val T) ! {
673676 return
674677 } $else $if T.unaliased_typ is string {
675678 decoder.decode_string (mut val)!
679+ } $else $if T.unaliased_typ is time.Time {
680+ value_info := decoder.current_node.value
681+ mut decoded_time := time.Time{}
682+ if value_info.value_kind == .string {
683+ decoded_time.from_json_string (decoder.json[value_info.position + 1 ..
684+ value_info.position + value_info.length - 1 ]) or {
685+ decoder.decode_error ('${typeof(val).name} : ${err.msg()} ' )!
686+ }
687+ } else if value_info.value_kind == .number {
688+ decoded_time.from_json_number (decoder.json[value_info.position..value_info.position +
689+ value_info.length]) or {
690+ decoder.decode_error ('${typeof(val).name} : ${err.msg()} ' )!
691+ }
692+ } else {
693+ decoder.decode_error ('Expected string or number, but got ${value_info.value_kind} ' )!
694+ }
695+ val = T (decoded_time)
676696 } $else $if T.unaliased_typ is $sumtype {
677697 decoder.decode_sumtype (mut val)!
678698 return
@@ -1173,6 +1193,7 @@ fn (mut decoder Decoder) decode_enum[T](mut val T) ! {
11731193
11741194const max_integer_number_digits = 20
11751195
1196+ @[markused]
11761197fn has_exponent_number_syntax (str string ) bool {
11771198 for c in str {
11781199 if c == `e` || c == `E` {
@@ -1182,6 +1203,7 @@ fn has_exponent_number_syntax(str string) bool {
11821203 return false
11831204}
11841205
1206+ @[markused]
11851207fn scientific_number_to_integer_string (str string ) ! string {
11861208 if ! has_exponent_number_syntax (str) {
11871209 // Handle plain decimal numbers with zero fractional part (e.g., "-123.0")
@@ -1326,8 +1348,10 @@ fn parse_integer_number[T](str string) !T {
13261348 return T (strconv.atou32 (int_str)! )
13271349 } $else $if T.unaliased_typ is u64 {
13281350 return T (strconv.atou64 (int_str)! )
1351+ } $else $if T is int {
1352+ return int (strconv.atoi64 (int_str)! )
13291353 } $else $if T.unaliased_typ is int {
1330- return T (strconv.atoi (int_str)! )
1354+ return T (int ( strconv.atoi64 (int_str)! ) )
13311355 } $else $if T.unaliased_typ is isize {
13321356 return T (isize (strconv.atoi64 (int_str)! ))
13331357 } $else $if T.unaliased_typ is usize {
@@ -1337,6 +1361,12 @@ fn parse_integer_number[T](str string) !T {
13371361 }
13381362}
13391363
1364+ @[markused]
1365+ fn parse_int_number (str string ) ! int {
1366+ int_str := scientific_number_to_integer_string (str)!
1367+ return int (strconv.atoi64 (int_str)! )
1368+ }
1369+
13401370fn parse_float_number [T](str string ) ! T {
13411371 $if js {
13421372 $if T.unaliased_typ is f32 {
@@ -1372,7 +1402,7 @@ fn (mut decoder Decoder) decode_number[T](val &T) ! {
13721402 u16 { * val = parse_integer_number[T](str)! }
13731403 u32 { * val = parse_integer_number[T](str)! }
13741404 u64 { * val = parse_integer_number[T](str)! }
1375- int { * val = parse_integer_number[T] (str)! }
1405+ int { * val = parse_int_number (str)! }
13761406 isize { * val = parse_integer_number[T](str)! }
13771407 usize { * val = parse_integer_number[T](str)! }
13781408 f32 { * val = parse_float_number[T](str)! }
@@ -1406,6 +1436,8 @@ fn (mut decoder Decoder) decode_number_from_string[T]() !T {
14061436 return parse_integer_number[T](str)!
14071437 } $else $if T.unaliased_typ is u64 {
14081438 return parse_integer_number[T](str)!
1439+ } $else $if T is int {
1440+ return parse_int_number (str)!
14091441 } $else $if T.unaliased_typ is int {
14101442 return parse_integer_number[T](str)!
14111443 } $else $if T.unaliased_typ is isize {
0 commit comments