1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

json2: encode array of all and verify sum type (#17051)

This commit is contained in:
Hitalo Souza 2023-02-01 11:52:58 -03:00 committed by GitHub
parent 9809427f40
commit ed58b95a9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 15 deletions

View File

@ -390,6 +390,12 @@ fn (e &Encoder) encode_array[U](val []U, level int, mut wr io.Writer) ! {
// e.encode_array(val[i], level + 1, mut wr)! // e.encode_array(val[i], level + 1, mut wr)!
} $else $if U is $Struct { } $else $if U is $Struct {
e.encode_struct(val[i], level + 1, mut wr)! e.encode_struct(val[i], level + 1, mut wr)!
} $else $if U is $Sumtype {
$if U is Any {
e.encode_any(val[i], level + 1, mut wr)!
} $else {
// TODO
}
} $else $if U is $Enum { } $else $if U is $Enum {
e.encode_any(i64(val[i]), level + 1, mut wr)! e.encode_any(i64(val[i]), level + 1, mut wr)!
} $else { } $else {

View File

@ -1,6 +1,11 @@
import x.json2 as json import x.json2 as json
import strings import strings
struct StructType[T] {
mut:
val T
}
fn test_json_string_characters() { fn test_json_string_characters() {
text := json.raw_decode(r'"\n\r\b\f\t\\\"\/"') or { '' } text := json.raw_decode(r'"\n\r\b\f\t\\\"\/"') or { '' }
assert text.json_str() == '"\\n\\r\\b\\f\\t\\\\\\"\\/"' assert text.json_str() == '"\\n\\r\\b\\f\\t\\\\\\"\\/"'
@ -116,7 +121,15 @@ fn test_encode_encodable() {
} }
fn test_encode_array() { fn test_encode_array() {
assert json.encode([1, 2, 3]) == '[1,2,3]' array_of_struct := [StructType[[]bool]{
val: [false, true]
}, StructType[[]bool]{
val: [true, false]
}]
assert json.encode_array([1, 2, 3]) == '[1,2,3]'
assert json.encode_array(array_of_struct) == '[{"val":[false,true]},{"val":[true,false]}]'
} }
fn test_encode_simple() { fn test_encode_simple() {

View File

@ -79,25 +79,36 @@ pub fn decode[T](src string) !T {
// encode is a generic function that encodes a type into a JSON string. // encode is a generic function that encodes a type into a JSON string.
pub fn encode[T](val T) string { pub fn encode[T](val T) string {
$if T is $Array {
$compile_error('Cannot use `json.encode` to encode array. Try `json.encode_array` instead')
}
mut sb := strings.new_builder(64) mut sb := strings.new_builder(64)
defer { defer {
unsafe { sb.free() } unsafe { sb.free() }
} }
$if T is $Array {
mut array_of_any := []Any{}
for value in val {
array_of_any << value
}
default_encoder.encode_value(array_of_any, mut sb) or {
dump(err)
default_encoder.encode_value[Null](null, mut sb) or {}
}
} $else {
default_encoder.encode_value(val, mut sb) or { default_encoder.encode_value(val, mut sb) or {
dump(err) dump(err)
default_encoder.encode_value[Null](null, mut sb) or {} default_encoder.encode_value[Null](null, mut sb) or {}
} }
return sb.str()
}
// encode_array is a generic function that encodes a array into a JSON string.
pub fn encode_array[T](val []T) string {
mut sb := strings.new_builder(64)
defer {
unsafe { sb.free() }
} }
default_encoder.encode_array(val, 1, mut sb) or {
dump(err)
default_encoder.encode_value[Null](null, mut sb) or {}
}
return sb.str() return sb.str()
} }