mirror of
https://github.com/vlang/v.git
synced 2025-09-08 06:41:58 -04:00
toml: implement decode method for Doc
(#19318)
This commit is contained in:
parent
81b30caf18
commit
140b5a3e39
@ -178,12 +178,50 @@ times = [
|
||||
assert toml.decode[Arrs](s)! == a
|
||||
}
|
||||
|
||||
fn test_decode_doc() {
|
||||
doc := toml.parse_text('name = "Peter"
|
||||
age = 28
|
||||
is_human = true
|
||||
salary = 100000.5
|
||||
title = 2')!
|
||||
e := doc.decode[Employee]()!
|
||||
assert e.name == 'Peter'
|
||||
assert e.age == 28
|
||||
assert e.salary == 100000.5
|
||||
assert e.is_human == true
|
||||
assert e.title == .manager
|
||||
}
|
||||
|
||||
fn test_unsupported_type() {
|
||||
s := 'name = "Peter"'
|
||||
err_msg := 'toml.decode: expected struct, found '
|
||||
toml.decode[string](s) or { assert err.msg() == err_msg + 'string' }
|
||||
toml.decode[[]string](s) or { assert err.msg() == err_msg + '[]string' }
|
||||
toml.decode[int](s) or { assert err.msg() == err_msg + 'int' }
|
||||
toml.decode[[]f32](s) or { assert err.msg() == err_msg + '[]f32' }
|
||||
if _ := toml.decode[string](s) {
|
||||
assert false
|
||||
} else {
|
||||
assert err.msg() == err_msg + 'string'
|
||||
}
|
||||
if _ := toml.decode[[]string](s) {
|
||||
assert false
|
||||
} else {
|
||||
assert err.msg() == err_msg + '[]string'
|
||||
}
|
||||
if _ := toml.decode[int](s) {
|
||||
assert false
|
||||
} else {
|
||||
assert err.msg() == err_msg + 'int'
|
||||
}
|
||||
if _ := toml.decode[[]f32](s) {
|
||||
assert false
|
||||
} else {
|
||||
assert err.msg() == err_msg + '[]f32'
|
||||
}
|
||||
// ...
|
||||
|
||||
doc := toml.parse_text('name = "Peter"')!
|
||||
assert doc.value('name').string() == 'Peter'
|
||||
if _ := doc.decode[string]() {
|
||||
assert false
|
||||
} else {
|
||||
assert err.msg() == 'Doc.decode: expected struct, found string'
|
||||
}
|
||||
}
|
||||
|
@ -252,6 +252,16 @@ fn parse_array_key(key string) (string, int) {
|
||||
return k, index
|
||||
}
|
||||
|
||||
// decode decodes a TOML `string` into the target struct type `T`.
|
||||
pub fn (d Doc) decode[T]() !T {
|
||||
$if T !is $struct {
|
||||
return error('Doc.decode: expected struct, found ${T.name}')
|
||||
}
|
||||
mut typ := T{}
|
||||
decode_struct(d.to_any(), mut typ)
|
||||
return typ
|
||||
}
|
||||
|
||||
// to_any converts the `Doc` to toml.Any type.
|
||||
pub fn (d Doc) to_any() Any {
|
||||
return ast_to_any(d.ast.table)
|
||||
|
Loading…
x
Reference in New Issue
Block a user