mirror of
https://github.com/zeromicro/go-zero.git
synced 2026-05-14 02:10:00 +08:00
fix/conf_multi_layer_map (#4407)
Co-authored-by: aiden.ma <Aiden.ma@yijinin.com>
This commit is contained in:
@@ -189,7 +189,7 @@ func buildFieldsInfo(tp reflect.Type, fullName string) (*fieldInfo, error) {
|
|||||||
switch tp.Kind() {
|
switch tp.Kind() {
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
return buildStructFieldsInfo(tp, fullName)
|
return buildStructFieldsInfo(tp, fullName)
|
||||||
case reflect.Array, reflect.Slice:
|
case reflect.Array, reflect.Slice, reflect.Map:
|
||||||
return buildFieldsInfo(mapping.Deref(tp.Elem()), fullName)
|
return buildFieldsInfo(mapping.Deref(tp.Elem()), fullName)
|
||||||
case reflect.Chan, reflect.Func:
|
case reflect.Chan, reflect.Func:
|
||||||
return nil, fmt.Errorf("unsupported type: %s", tp.Kind())
|
return nil, fmt.Errorf("unsupported type: %s", tp.Kind())
|
||||||
@@ -332,6 +332,8 @@ func toLowerCaseKeyMap(m map[string]any, info *fieldInfo) map[string]any {
|
|||||||
res[lk] = toLowerCaseInterface(v, ti)
|
res[lk] = toLowerCaseInterface(v, ti)
|
||||||
} else if info.mapField != nil {
|
} else if info.mapField != nil {
|
||||||
res[k] = toLowerCaseInterface(v, info.mapField)
|
res[k] = toLowerCaseInterface(v, info.mapField)
|
||||||
|
} else if vv, ok := v.(map[string]any); ok {
|
||||||
|
res[k] = toLowerCaseKeyMap(vv, info)
|
||||||
} else {
|
} else {
|
||||||
res[k] = v
|
res[k] = v
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1192,6 +1192,29 @@ Email = "bar"`)
|
|||||||
assert.Len(t, c.Value, 2)
|
assert.Len(t, c.Value, 2)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("multi layer map", func(t *testing.T) {
|
||||||
|
type Value struct {
|
||||||
|
User struct {
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
Value map[string]map[string]Value
|
||||||
|
}
|
||||||
|
|
||||||
|
var input = []byte(`
|
||||||
|
[Value.first.User1.User]
|
||||||
|
Name = "foo"
|
||||||
|
[Value.second.User2.User]
|
||||||
|
Name = "bar"
|
||||||
|
`)
|
||||||
|
var c Config
|
||||||
|
if assert.NoError(t, LoadFromTomlBytes(input, &c)) {
|
||||||
|
assert.Len(t, c.Value, 2)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_getFullName(t *testing.T) {
|
func Test_getFullName(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user