Support for embedded structs + sep:"none".

Map key/value separator is now hardcoded to `=`. This allows the
`sep` tag to continue to be used for slice separation, cascading to
support maps with slice values eg. `--set a=1,2,3`.
This commit is contained in:
Alec Thomas
2018-06-14 11:27:10 +10:00
parent 51ca3e76a8
commit 9a68d32e72
5 changed files with 73 additions and 21 deletions
+24 -6
View File
@@ -33,17 +33,35 @@ func dashedString(s string) string {
return strings.Join(camelCase(s), "-")
}
type flattenedField struct {
field reflect.StructField
value reflect.Value
}
func flattenedFields(v reflect.Value) (out []flattenedField) {
for i := 0; i < v.NumField(); i++ {
ft := v.Type().Field(i)
fv := v.Field(i)
if ft.Anonymous {
out = append(out, flattenedFields(fv)...)
continue
}
if !fv.CanSet() {
continue
}
out = append(out, flattenedField{ft, fv})
}
return
}
func buildNode(k *Kong, v reflect.Value, typ NodeType, seenFlags map[string]bool) *Node {
node := &Node{
Type: typ,
Target: v,
}
for i := 0; i < v.NumField(); i++ {
ft := v.Type().Field(i)
if strings.ToLower(ft.Name[0:1]) == ft.Name[0:1] {
continue
}
fv := v.Field(i)
for _, field := range flattenedFields(v) {
ft := field.field
fv := field.value
name := ft.Tag.Get("name")
if name == "" {