Skip to content

Commit 591dd19

Browse files
committed
Fix nested load config
1 parent e7bf770 commit 591dd19

File tree

3 files changed

+52
-14
lines changed

3 files changed

+52
-14
lines changed

admin.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
top:
2+
- name: Permission
3+
key: author_manage
4+
icon:
5+
children:
6+
- name: My Permission
7+
key: my_author
8+
icon:
9+
children:
10+
- name: Apply
11+
key: author_apply
12+
icon:
13+
- name: My Applies
14+
key: author_apply_record
15+
icon:
16+
- name: My Permission
17+
key: my_author
18+
icon:

configor_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,3 +665,19 @@ func TestConfigFromEnv(t *testing.T) {
665665
t.Error("Failed to load number from env")
666666
}
667667
}
668+
669+
type Menu struct {
670+
Key string `json:"key" yaml:"key"`
671+
Name string `json:"name" yaml:"name"`
672+
Icon string `json:"icon" yaml:"icon"`
673+
Children []Menu `json:"children" yaml:"children"`
674+
}
675+
676+
type MenuList struct {
677+
Top []Menu `json:"top" yaml:"top"`
678+
}
679+
680+
func TestLoadNestedConfig(t *testing.T) {
681+
adminConfig := MenuList{}
682+
New(&Config{Verbose: true}).Load(&adminConfig, "admin.yml")
683+
}

utils.go

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -317,22 +317,26 @@ func (configor *Configor) processTags(config interface{}, prefixes ...string) er
317317
}
318318
}
319319
} else {
320-
// load slice from env
321-
newVal := reflect.New(field.Type().Elem()).Elem()
322-
if newVal.Kind() == reflect.Struct {
323-
idx := 0
324-
for {
325-
newVal = reflect.New(field.Type().Elem()).Elem()
326-
if err := configor.processTags(newVal.Addr().Interface(), append(getPrefixForStruct(prefixes, &fieldStruct), fmt.Sprint(idx))...); err != nil {
327-
return err
328-
} else if reflect.DeepEqual(newVal.Interface(), reflect.New(field.Type().Elem()).Elem().Interface()) {
329-
break
330-
} else {
331-
idx++
332-
field.Set(reflect.Append(field, newVal))
320+
defer func(field reflect.Value, fieldStruct reflect.StructField) {
321+
if !configValue.IsZero() {
322+
// load slice from env
323+
newVal := reflect.New(field.Type().Elem()).Elem()
324+
if newVal.Kind() == reflect.Struct {
325+
idx := 0
326+
for {
327+
newVal = reflect.New(field.Type().Elem()).Elem()
328+
if err := configor.processTags(newVal.Addr().Interface(), append(getPrefixForStruct(prefixes, &fieldStruct), fmt.Sprint(idx))...); err != nil {
329+
return // err
330+
} else if reflect.DeepEqual(newVal.Interface(), reflect.New(field.Type().Elem()).Elem().Interface()) {
331+
break
332+
} else {
333+
idx++
334+
field.Set(reflect.Append(field, newVal))
335+
}
336+
}
333337
}
334338
}
335-
}
339+
}(field, fieldStruct)
336340
}
337341
}
338342
}

0 commit comments

Comments
 (0)