toml: add Any.default_to() method (#12506)
parent
b367ed9ba3
commit
76cf11e6b5
|
@ -149,18 +149,26 @@ pub fn (a Any) datetime() DateTime {
|
|||
}
|
||||
}
|
||||
|
||||
// default_to returns `value` if `a Any` is `Null`.
|
||||
// This can be used to set default values when retrieving
|
||||
// values. E.g.: `toml_doc.value('wrong.key').default_to(123).int()`
|
||||
pub fn (a Any) default_to(value Any) Any {
|
||||
match a {
|
||||
Null { return value }
|
||||
else { return a }
|
||||
}
|
||||
}
|
||||
|
||||
// value queries a value from the map.
|
||||
// `key` should be in "dotted" form (`a.b.c`).
|
||||
// `key` supports quoted keys like `a."b.c"`.
|
||||
pub fn (m map[string]Any) value(key string) ?Any {
|
||||
key_split := parse_dotted_key(key) ?
|
||||
pub fn (m map[string]Any) value(key string) Any {
|
||||
key_split := parse_dotted_key(key) or { return Any(Null{}) }
|
||||
return m.value_(key_split)
|
||||
}
|
||||
|
||||
fn (m map[string]Any) value_(key []string) ?Any {
|
||||
value := m[key[0]] or {
|
||||
return error(@MOD + '.' + @STRUCT + '.' + @FN + ' key "${key[0]}" does not exist')
|
||||
}
|
||||
fn (m map[string]Any) value_(key []string) Any {
|
||||
value := m[key[0]] or { return Any(Null{}) }
|
||||
// `match` isn't currently very suitable for these types of sum type constructs...
|
||||
if value is map[string]Any {
|
||||
if key.len <= 1 {
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
import toml
|
||||
|
||||
fn test_default_to() {
|
||||
default_value := 4321
|
||||
mut toml_txt := 'var = 1234'
|
||||
toml_doc := toml.parse(toml_txt) or { panic(err) }
|
||||
value := toml_doc.value('tar').default_to(default_value).int()
|
||||
assert value == default_value
|
||||
}
|
|
@ -61,31 +61,31 @@ fn test_tables() {
|
|||
|
||||
mut m := toml_doc.value('tbl') as map[string]toml.Any
|
||||
|
||||
value = m.value('a.b.c.d.e') or { panic(err) }
|
||||
value = m.value('a.b.c.d.e')
|
||||
assert value.int() == 1
|
||||
|
||||
value = m.value('x.a.b.c.d.e') or { panic(err) }
|
||||
value = m.value('x.a.b.c.d.e')
|
||||
assert value.int() == 1
|
||||
|
||||
arr := toml_doc.value('arr') as []toml.Any
|
||||
|
||||
for i := 0; i < arr.len; i++ {
|
||||
entry := (arr[i] as map[string]toml.Any)
|
||||
value = entry.value('t.a.b') or { panic(err) }
|
||||
value = entry.value('t.a.b')
|
||||
assert value.int() == i + 1
|
||||
value = entry.value('T.a.b') or { panic(err) }
|
||||
value = entry.value('T.a.b')
|
||||
assert value.int() == i + 1
|
||||
}
|
||||
|
||||
arr0 := arr[0] as map[string]toml.Any
|
||||
value = arr0.value('t.a.b') or { panic(err) }
|
||||
value = arr0.value('t.a.b')
|
||||
assert value.int() == 1
|
||||
value = arr0.value('T.a.b') or { panic(err) }
|
||||
value = arr0.value('T.a.b')
|
||||
assert value.int() == 1
|
||||
|
||||
arr1 := arr[1] as map[string]toml.Any
|
||||
value = arr1.value('t.a.b') or { panic(err) }
|
||||
value = arr1.value('t.a.b')
|
||||
assert value.int() == 2
|
||||
value = arr1.value('T.a.b') or { panic(err) }
|
||||
value = arr1.value('T.a.b')
|
||||
assert value.int() == 2
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ fn test_toml_with_bom() {
|
|||
assert title as string == 'TOML Example'
|
||||
|
||||
owner := toml_doc.value('owner') as map[string]toml.Any
|
||||
any_name := owner.value('name') or { panic(err) }
|
||||
any_name := owner.value('name')
|
||||
assert any_name.string() == 'Tom Preston-Werner'
|
||||
|
||||
database := toml_doc.value('database') as map[string]toml.Any
|
||||
|
|
|
@ -10,7 +10,7 @@ fn test_toml_known_memory_corruption() {
|
|||
toml_doc := toml.parse(toml_text) or { panic(err) }
|
||||
|
||||
owner := toml_doc.value('owner') as map[string]toml.Any
|
||||
any_name := owner.value('name') or { panic(err) }
|
||||
any_name := owner.value('name')
|
||||
// This assert code path will cause the corruption.
|
||||
assert any_name.string() == 'Tom Preston-Werner'
|
||||
|
||||
|
|
Loading…
Reference in New Issue