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  }