github.com/avenga/couper@v1.12.2/config/configload/collect/error_handler.go (about) 1 package collect 2 3 import ( 4 "reflect" 5 6 "github.com/avenga/couper/config" 7 ) 8 9 type ErrorHandlerSetter interface { 10 Set(handler *config.ErrorHandler) 11 } 12 13 func ErrorHandlerSetters(block interface{}) []ErrorHandlerSetter { 14 var errorSetter []ErrorHandlerSetter 15 16 t := reflect.ValueOf(block) 17 elem := t 18 if t.Kind() == reflect.Ptr { 19 elem = t.Elem() 20 } 21 22 if elem.Kind() != reflect.Struct { 23 return errorSetter 24 } 25 26 for i := 0; i < elem.Type().NumField(); i++ { 27 field := elem.Type().Field(i) 28 if !elem.Field(i).CanInterface() { 29 continue 30 } 31 32 switch field.Type.Kind() { 33 case reflect.Struct: 34 if field.Anonymous && t.CanInterface() { // composition: type check fields parent 35 setter, ok := t.Interface().(ErrorHandlerSetter) 36 if ok { 37 errorSetter = append(errorSetter, setter) 38 return errorSetter 39 } 40 } 41 42 errorSetter = append(errorSetter, ErrorHandlerSetters(elem.Field(i).Interface())...) 43 case reflect.Slice: 44 f := elem.Field(i) 45 for s := 0; s < f.Len(); s++ { 46 idx := f.Index(s) 47 if idx.CanInterface() { 48 errorSetter = append(errorSetter, ErrorHandlerSetters(idx.Interface())...) 49 } 50 } 51 } 52 } 53 return errorSetter 54 }