x.json2.decoder2: fix wrong sumtype and struct decoder in array (#23041)

This commit is contained in:
Hitalo Souza 2024-12-02 01:21:37 -04:00 committed by GitHub
parent 3036a5afc6
commit f29fb5a9f5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 67 additions and 76 deletions

View file

@ -218,10 +218,6 @@ fn (mut checker Decoder) check_json_format(val string) ! {
continue
}
if val[checker.checker_idx] != `"` {
checker.checker_idx++
}
// skip whitespace
for val[checker.checker_idx] in [` `, `\t`, `\n`] {
if checker.checker_idx >= checker_end - 1 {
@ -234,39 +230,21 @@ fn (mut checker Decoder) check_json_format(val string) ! {
continue
}
match val[checker.checker_idx] {
`"` {
// Object key
checker.check_json_format(val)!
if val[checker.checker_idx] != `"` {
return checker.error('Expecting object key')
}
for val[checker.checker_idx] != `:` {
if checker.checker_idx >= checker_end - 1 {
return checker.error('EOF error: key colon not found')
}
if val[checker.checker_idx] !in [` `, `\t`, `\n`] {
return checker.error('invalid value after object key')
}
checker.checker_idx++
}
// Object key
checker.check_json_format(val)!
for val[checker.checker_idx] != `:` {
if checker.checker_idx >= checker_end - 1 {
return checker.error('EOF error: key colon not found')
}
`[`, `{`, `0`...`9`, `-`, `n`, `t`, `f` {
// skip
}
`}` {
return
}
`]` {
return checker.error('Expecting key. Found closing bracket')
}
`,` {
return checker.error('invalid object key')
}
`:` {
return checker.error('empty object key')
}
else {
return checker.error('`${[val[checker.checker_idx]].bytestr()}` is an invalid object key')
if val[checker.checker_idx] !in [` `, `\t`, `\n`] {
return checker.error('invalid value after object key')
}
checker.checker_idx++
}
if val[checker.checker_idx] != `:` {
@ -282,38 +260,31 @@ fn (mut checker Decoder) check_json_format(val string) ! {
match val[checker.checker_idx] {
`"`, `[`, `{`, `0`...`9`, `-`, `n`, `t`, `f` {
for val[checker.checker_idx] != `}` {
if checker.checker_idx >= checker_end - 1 {
return checker.error('EOF error: object value not closed')
}
checker.check_json_format(val)!
// whitespace
checker.check_json_format(val)!
// whitespace
for val[checker.checker_idx] in [` `, `\t`, `\n`] {
checker.checker_idx++
}
if val[checker.checker_idx] == `}` {
break
}
if checker.checker_idx >= checker_end - 1 {
return checker.error('EOF error: braces are not closed')
}
if val[checker.checker_idx] == `,` {
checker.checker_idx++
for val[checker.checker_idx] in [` `, `\t`, `\n`] {
checker.checker_idx++
}
if val[checker.checker_idx] != `"` {
return checker.error('Expecting object key')
}
} else {
if val[checker.checker_idx] == `}` {
break
}
if checker.checker_idx >= checker_end - 1 {
return checker.error('EOF error: braces are not closed')
}
if val[checker.checker_idx] == `,` {
checker.checker_idx++
for val[checker.checker_idx] in [` `, `\t`, `\n`] {
checker.checker_idx++
}
if val[checker.checker_idx] != `"` {
return checker.error('Expecting object key')
} else {
break
}
} else {
if val[checker.checker_idx] == `}` {
break
} else {
return
}
return checker.error('invalid object value')
}
}
}
@ -322,9 +293,6 @@ fn (mut checker Decoder) check_json_format(val string) ! {
}
}
}
if checker.checker_idx < checker_end - 2 {
checker.checker_idx++
}
}
.array {
// check if the JSON string is an empty array
@ -608,6 +576,7 @@ fn (mut decoder Decoder) decode_value[T](mut val T) ! {
}
} $else $if T.unaliased_typ is $sumtype {
decoder.decode_sumtype(mut val)!
return
} $else $if T.unaliased_typ is time.Time {
time_info := decoder.current_node.value
@ -667,6 +636,7 @@ fn (mut decoder Decoder) decode_value[T](mut val T) ! {
}
}
}
return
} $else $if T.unaliased_typ is bool {
value_info := decoder.current_node.value