all: Refactor preparing configuration (#7127)

This commit is contained in:
Simon Frei
2020-11-20 14:21:54 +01:00
committed by GitHub
parent 641b7aee38
commit 24af89c8e2
19 changed files with 207 additions and 147 deletions
+30 -3
View File
@@ -83,6 +83,10 @@ func SetDefaults(data interface{}) {
default:
panic(f.Type())
}
} else if f.CanSet() && f.Kind() == reflect.Struct && f.CanAddr() {
if addr := f.Addr(); addr.CanInterface() {
SetDefaults(addr.Interface())
}
}
}
}
@@ -137,9 +141,22 @@ func UniqueTrimmedStrings(ss []string) []string {
return us
}
func FillNilExceptDeprecated(data interface{}) {
fillNil(data, true)
}
func FillNil(data interface{}) {
fillNil(data, false)
}
func fillNil(data interface{}, skipDeprecated bool) {
s := reflect.ValueOf(data).Elem()
t := s.Type()
for i := 0; i < s.NumField(); i++ {
if skipDeprecated && strings.HasPrefix(t.Field(i).Name, "Deprecated") {
continue
}
f := s.Field(i)
for f.Kind() == reflect.Ptr && f.IsZero() && f.CanSet() {
@@ -160,9 +177,19 @@ func FillNil(data interface{}) {
}
}
if f.Kind() == reflect.Struct && f.CanAddr() {
if addr := f.Addr(); addr.CanInterface() {
FillNil(addr.Interface())
switch f.Kind() {
case reflect.Slice:
if f.Type().Elem().Kind() != reflect.Struct {
continue
}
for i := 0; i < f.Len(); i++ {
fillNil(f.Index(i).Addr().Interface(), skipDeprecated)
}
case reflect.Struct:
if f.CanAddr() {
if addr := f.Addr(); addr.CanInterface() {
fillNil(addr.Interface(), skipDeprecated)
}
}
}
}