@@ -31,7 +31,7 @@ func Load(filepath string, dst interface{}) error {
31
31
return err
32
32
}
33
33
34
- return bindFlags (dst , metadata )
34
+ return bindFlags (dst , metadata , "" )
35
35
}
36
36
37
37
// bindEnvVariables will bind CLI flags to their respective elements in dst, defined by the struct-tag "env".
@@ -65,7 +65,7 @@ func bindEnvVariables(dst interface{}) error {
65
65
}
66
66
67
67
// bindFlags will bind CLI flags to their respective elements in dst, defined by the struct-tag "flag".
68
- func bindFlags (dst interface {}, metadata toml.MetaData ) error {
68
+ func bindFlags (dst interface {}, metadata toml.MetaData , fieldPath string ) error {
69
69
fields := structs .Fields (dst )
70
70
for _ , field := range fields {
71
71
tag := field .Tag (flagTag )
@@ -75,7 +75,18 @@ func bindFlags(dst interface{}, metadata toml.MetaData) error {
75
75
continue
76
76
}
77
77
78
- if err := bindFlags (dstElem .Addr ().Interface (), metadata ); err != nil {
78
+ var path string
79
+ if fieldPath != "" {
80
+ path = fmt .Sprintf ("%s." , fieldPath )
81
+ }
82
+
83
+ if field .Tag (tomlTag ) != "" {
84
+ path += field .Tag (tomlTag )
85
+ } else {
86
+ path += field .Name ()
87
+ }
88
+
89
+ if err := bindFlags (dstElem .Addr ().Interface (), metadata , path ); err != nil {
79
90
return err
80
91
}
81
92
@@ -91,7 +102,15 @@ func bindFlags(dst interface{}, metadata toml.MetaData) error {
91
102
useFlagDefaultValue := false
92
103
if ! isFlagSet (tag ) {
93
104
_ , envHasKey := os .LookupEnv (field .Tag (envTag ))
94
- if envHasKey || tomlHasKey (metadata , field .Tag (tomlTag )) {
105
+
106
+ var tomlKey string
107
+ if fieldPath == "" {
108
+ tomlKey = field .Tag (tomlTag )
109
+ } else {
110
+ tomlKey = fmt .Sprintf ("%s.%s" , fieldPath , field .Tag (tomlTag ))
111
+ }
112
+
113
+ if envHasKey || tomlHasKey (metadata , tomlKey ) {
95
114
continue
96
115
} else {
97
116
useFlagDefaultValue = true
@@ -190,10 +209,10 @@ func isFlagSet(tag string) bool {
190
209
return flagSet
191
210
}
192
211
193
- // tomlHasKey will check if the tag presents in toml metadata
194
- func tomlHasKey (metadata toml.MetaData , tag string ) bool {
212
+ // tomlHasKey will check if the toml key presents in toml metadata
213
+ func tomlHasKey (metadata toml.MetaData , tomlKey string ) bool {
195
214
for _ , key := range metadata .Keys () {
196
- if strings .ToLower (key .String ()) == strings . ToLower ( tag ) {
215
+ if strings .EqualFold (key .String (), tomlKey ) {
197
216
return true
198
217
}
199
218
}
0 commit comments