Skip to content

Commit

Permalink
toml: implement decode method for Doc (#19318)
Browse files Browse the repository at this point in the history
  • Loading branch information
ttytm committed Sep 11, 2023
1 parent 81b30ca commit 140b5a3
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 4 deletions.
46 changes: 42 additions & 4 deletions vlib/toml/tests/encode_and_decode_test.v
Expand Up @@ -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'
}
}
10 changes: 10 additions & 0 deletions vlib/toml/toml.v
Expand Up @@ -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)
Expand Down

0 comments on commit 140b5a3

Please sign in to comment.