fix: conf anonymous overlay problem (#2847)

This commit is contained in:
Kevin Wan
2023-02-05 14:40:57 +08:00
committed by GitHub
parent aed312f3c0
commit a019a1f59f
4 changed files with 55 additions and 15 deletions

View File

@@ -107,6 +107,20 @@ func MustLoad(path string, v any, opts ...Option) {
}
}
func addOrMergeFields(info map[string]fieldInfo, key, name string, fields map[string]fieldInfo) {
if prev, ok := info[key]; ok {
// merge fields
for k, v := range fields {
prev.children[k] = v
}
} else {
info[key] = fieldInfo{
name: name,
children: fields,
}
}
}
func buildFieldsInfo(tp reflect.Type) map[string]fieldInfo {
tp = mapping.Deref(tp)
@@ -134,11 +148,12 @@ func buildStructFieldsInfo(tp reflect.Type) map[string]fieldInfo {
if ft.Kind() == reflect.Struct {
fields := buildFieldsInfo(ft)
for k, v := range fields {
info[k] = v
addOrMergeFields(info, k, v.name, v.children)
}
} else {
info[lowerCaseName] = fieldInfo{
name: name,
name: name,
children: make(map[string]fieldInfo),
}
}
continue
@@ -154,17 +169,7 @@ func buildStructFieldsInfo(tp reflect.Type) map[string]fieldInfo {
fields = buildFieldsInfo(ft.Elem())
}
if prev, ok := info[lowerCaseName]; ok {
// merge fields
for k, v := range fields {
prev.children[k] = v
}
} else {
info[lowerCaseName] = fieldInfo{
name: name,
children: fields,
}
}
addOrMergeFields(info, lowerCaseName, name, fields)
}
return info