mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
toml: support [toml: '...'] attributes (#15497)
This commit is contained in:
parent
dda475bcc8
commit
d40d761e38
@ -330,96 +330,107 @@ fn (a Any) value_(value Any, key []string) Any {
|
||||
pub fn (a Any) reflect<T>() T {
|
||||
mut reflected := T{}
|
||||
$for field in T.fields {
|
||||
mut toml_field_name := field.name
|
||||
// Remapping of field names, for example:
|
||||
// TOML: 'assert = "ok"'
|
||||
// V: User { asrt string [toml: 'assert'] }
|
||||
// User.asrt == 'ok'
|
||||
for attr in field.attrs {
|
||||
if attr.starts_with('toml:') {
|
||||
toml_field_name = attr.all_after(':').trim_space()
|
||||
}
|
||||
}
|
||||
|
||||
$if field.typ is string {
|
||||
reflected.$(field.name) = a.value(field.name).default_to('').string()
|
||||
reflected.$(field.name) = a.value(toml_field_name).default_to('').string()
|
||||
} $else $if field.typ is bool {
|
||||
reflected.$(field.name) = a.value(field.name).default_to(false).bool()
|
||||
reflected.$(field.name) = a.value(toml_field_name).default_to(false).bool()
|
||||
} $else $if field.typ is int {
|
||||
reflected.$(field.name) = a.value(field.name).default_to(0).int()
|
||||
reflected.$(field.name) = a.value(toml_field_name).default_to(0).int()
|
||||
} $else $if field.typ is f32 {
|
||||
reflected.$(field.name) = a.value(field.name).default_to(0.0).f32()
|
||||
reflected.$(field.name) = a.value(toml_field_name).default_to(0.0).f32()
|
||||
} $else $if field.typ is f64 {
|
||||
reflected.$(field.name) = a.value(field.name).default_to(0.0).f64()
|
||||
reflected.$(field.name) = a.value(toml_field_name).default_to(0.0).f64()
|
||||
} $else $if field.typ is i64 {
|
||||
reflected.$(field.name) = a.value(field.name).default_to(0).i64()
|
||||
reflected.$(field.name) = a.value(toml_field_name).default_to(0).i64()
|
||||
} $else $if field.typ is u64 {
|
||||
reflected.$(field.name) = a.value(field.name).default_to(0).u64()
|
||||
reflected.$(field.name) = a.value(toml_field_name).default_to(0).u64()
|
||||
} $else $if field.typ is Any {
|
||||
reflected.$(field.name) = a.value(field.name)
|
||||
reflected.$(field.name) = a.value(toml_field_name)
|
||||
} $else $if field.typ is DateTime {
|
||||
dt := DateTime{'0000-00-00T00:00:00.000'}
|
||||
reflected.$(field.name) = a.value(field.name).default_to(dt).datetime()
|
||||
reflected.$(field.name) = a.value(toml_field_name).default_to(dt).datetime()
|
||||
} $else $if field.typ is Date {
|
||||
da := Date{'0000-00-00'}
|
||||
reflected.$(field.name) = a.value(field.name).default_to(da).date()
|
||||
reflected.$(field.name) = a.value(toml_field_name).default_to(da).date()
|
||||
} $else $if field.typ is Time {
|
||||
t := Time{'00:00:00.000'}
|
||||
reflected.$(field.name) = a.value(field.name).default_to(t).time()
|
||||
reflected.$(field.name) = a.value(toml_field_name).default_to(t).time()
|
||||
}
|
||||
// Arrays of primitive types
|
||||
$else $if field.typ is []string {
|
||||
any_array := a.value(field.name).array()
|
||||
any_array := a.value(toml_field_name).array()
|
||||
reflected.$(field.name) = any_array.as_strings()
|
||||
} $else $if field.typ is []bool {
|
||||
any_array := a.value(field.name).array()
|
||||
any_array := a.value(toml_field_name).array()
|
||||
mut arr := []bool{cap: any_array.len}
|
||||
for any_value in any_array {
|
||||
arr << any_value.bool()
|
||||
}
|
||||
reflected.$(field.name) = arr
|
||||
} $else $if field.typ is []int {
|
||||
any_array := a.value(field.name).array()
|
||||
any_array := a.value(toml_field_name).array()
|
||||
mut arr := []int{cap: any_array.len}
|
||||
for any_value in any_array {
|
||||
arr << any_value.int()
|
||||
}
|
||||
reflected.$(field.name) = arr
|
||||
} $else $if field.typ is []f32 {
|
||||
any_array := a.value(field.name).array()
|
||||
any_array := a.value(toml_field_name).array()
|
||||
mut arr := []f32{cap: any_array.len}
|
||||
for any_value in any_array {
|
||||
arr << any_value.f32()
|
||||
}
|
||||
reflected.$(field.name) = arr
|
||||
} $else $if field.typ is []f64 {
|
||||
any_array := a.value(field.name).array()
|
||||
any_array := a.value(toml_field_name).array()
|
||||
mut arr := []f64{cap: any_array.len}
|
||||
for any_value in any_array {
|
||||
arr << any_value.f64()
|
||||
}
|
||||
reflected.$(field.name) = arr
|
||||
} $else $if field.typ is []i64 {
|
||||
any_array := a.value(field.name).array()
|
||||
any_array := a.value(toml_field_name).array()
|
||||
mut arr := []i64{cap: any_array.len}
|
||||
for any_value in any_array {
|
||||
arr << any_value.i64()
|
||||
}
|
||||
reflected.$(field.name) = arr
|
||||
} $else $if field.typ is []u64 {
|
||||
any_array := a.value(field.name).array()
|
||||
any_array := a.value(toml_field_name).array()
|
||||
mut arr := []u64{cap: any_array.len}
|
||||
for any_value in any_array {
|
||||
arr << any_value.u64()
|
||||
}
|
||||
reflected.$(field.name) = arr
|
||||
} $else $if field.typ is []Any {
|
||||
reflected.$(field.name) = a.value(field.name).array()
|
||||
reflected.$(field.name) = a.value(toml_field_name).array()
|
||||
} $else $if field.typ is []DateTime {
|
||||
any_array := a.value(field.name).array()
|
||||
any_array := a.value(toml_field_name).array()
|
||||
mut arr := []DateTime{cap: any_array.len}
|
||||
for any_value in any_array {
|
||||
arr << any_value.datetime()
|
||||
}
|
||||
reflected.$(field.name) = arr
|
||||
} $else $if field.typ is []Date {
|
||||
any_array := a.value(field.name).array()
|
||||
any_array := a.value(toml_field_name).array()
|
||||
mut arr := []Date{cap: any_array.len}
|
||||
for any_value in any_array {
|
||||
arr << any_value.date()
|
||||
}
|
||||
reflected.$(field.name) = arr
|
||||
} $else $if field.typ is []Time {
|
||||
any_array := a.value(field.name).array()
|
||||
any_array := a.value(toml_field_name).array()
|
||||
mut arr := []Time{cap: any_array.len}
|
||||
for any_value in any_array {
|
||||
arr << any_value.time()
|
||||
@ -428,68 +439,68 @@ pub fn (a Any) reflect<T>() T {
|
||||
}
|
||||
// String key maps of primitive types
|
||||
$else $if field.typ is map[string]string {
|
||||
any_map := a.value(field.name).as_map()
|
||||
any_map := a.value(toml_field_name).as_map()
|
||||
reflected.$(field.name) = any_map.as_strings()
|
||||
} $else $if field.typ is map[string]bool {
|
||||
any_map := a.value(field.name).as_map()
|
||||
any_map := a.value(toml_field_name).as_map()
|
||||
mut type_map := map[string]bool{}
|
||||
for k, any_value in any_map {
|
||||
type_map[k] = any_value.bool()
|
||||
}
|
||||
reflected.$(field.name) = type_map.clone()
|
||||
} $else $if field.typ is map[string]int {
|
||||
any_map := a.value(field.name).as_map()
|
||||
any_map := a.value(toml_field_name).as_map()
|
||||
mut type_map := map[string]int{}
|
||||
for k, any_value in any_map {
|
||||
type_map[k] = any_value.int()
|
||||
}
|
||||
reflected.$(field.name) = type_map.clone()
|
||||
} $else $if field.typ is map[string]f32 {
|
||||
any_map := a.value(field.name).as_map()
|
||||
any_map := a.value(toml_field_name).as_map()
|
||||
mut type_map := map[string]f32{}
|
||||
for k, any_value in any_map {
|
||||
type_map[k] = any_value.f32()
|
||||
}
|
||||
reflected.$(field.name) = type_map.clone()
|
||||
} $else $if field.typ is map[string]f64 {
|
||||
any_map := a.value(field.name).as_map()
|
||||
any_map := a.value(toml_field_name).as_map()
|
||||
mut type_map := map[string]f64{}
|
||||
for k, any_value in any_map {
|
||||
type_map[k] = any_value.f64()
|
||||
}
|
||||
reflected.$(field.name) = type_map.clone()
|
||||
} $else $if field.typ is map[string]i64 {
|
||||
any_map := a.value(field.name).as_map()
|
||||
any_map := a.value(toml_field_name).as_map()
|
||||
mut type_map := map[string]i64{}
|
||||
for k, any_value in any_map {
|
||||
type_map[k] = any_value.i64()
|
||||
}
|
||||
reflected.$(field.name) = type_map.clone()
|
||||
} $else $if field.typ is map[string]u64 {
|
||||
any_map := a.value(field.name).as_map()
|
||||
any_map := a.value(toml_field_name).as_map()
|
||||
mut type_map := map[string]u64{}
|
||||
for k, any_value in any_map {
|
||||
type_map[k] = any_value.u64()
|
||||
}
|
||||
reflected.$(field.name) = type_map.clone()
|
||||
} $else $if field.typ is map[string]Any {
|
||||
reflected.$(field.name) = a.value(field.name).as_map()
|
||||
reflected.$(field.name) = a.value(toml_field_name).as_map()
|
||||
} $else $if field.typ is map[string]DateTime {
|
||||
any_map := a.value(field.name).as_map()
|
||||
any_map := a.value(toml_field_name).as_map()
|
||||
mut type_map := map[string]DateTime{}
|
||||
for k, any_value in any_map {
|
||||
type_map[k] = any_value.datetime()
|
||||
}
|
||||
reflected.$(field.name) = type_map.clone()
|
||||
} $else $if field.typ is map[string]Date {
|
||||
any_map := a.value(field.name).as_map()
|
||||
any_map := a.value(toml_field_name).as_map()
|
||||
mut type_map := map[string]Date{}
|
||||
for k, any_value in any_map {
|
||||
type_map[k] = any_value.date()
|
||||
}
|
||||
reflected.$(field.name) = type_map.clone()
|
||||
} $else $if field.typ is map[string]Time {
|
||||
any_map := a.value(field.name).as_map()
|
||||
any_map := a.value(toml_field_name).as_map()
|
||||
mut type_map := map[string]Time{}
|
||||
for k, any_value in any_map {
|
||||
type_map[k] = any_value.time()
|
||||
|
@ -24,11 +24,20 @@ int_map = {"a" = 0, "b" = 1, "c" = 2, "d" = 3}
|
||||
text = "Tom has done many great things"
|
||||
years_of_service = 5
|
||||
|
||||
[field_remap]
|
||||
txt = "I am remapped"
|
||||
uint64 = 100
|
||||
|
||||
[config]
|
||||
data = [ 1, 2, 3 ]
|
||||
levels = { "info" = 1, "warn" = 2, "critical" = 3 }
|
||||
'
|
||||
|
||||
struct FieldRemap {
|
||||
text string [toml: 'txt']
|
||||
num u64 [toml: 'uint64']
|
||||
}
|
||||
|
||||
struct Bio {
|
||||
text string
|
||||
years_of_service int
|
||||
@ -46,7 +55,8 @@ struct User {
|
||||
|
||||
config toml.Any
|
||||
mut:
|
||||
bio Bio
|
||||
bio Bio
|
||||
remap FieldRemap
|
||||
}
|
||||
|
||||
fn test_reflect() {
|
||||
@ -54,6 +64,7 @@ fn test_reflect() {
|
||||
|
||||
mut user := toml_doc.reflect<User>()
|
||||
user.bio = toml_doc.value('bio').reflect<Bio>()
|
||||
user.remap = toml_doc.value('field_remap').reflect<FieldRemap>()
|
||||
|
||||
assert user.name == 'Tom'
|
||||
assert user.age == 45
|
||||
@ -71,6 +82,9 @@ fn test_reflect() {
|
||||
assert user.bio.text == 'Tom has done many great things'
|
||||
assert user.bio.years_of_service == 5
|
||||
|
||||
assert user.remap.text == 'I am remapped'
|
||||
assert user.remap.num == 100
|
||||
|
||||
assert user.config.value('data[0]').int() == 1
|
||||
assert user.config.value('levels.warn').int() == 2
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user