in integration_test/metadata/integration_metadata.go [173:219]
func NewIntegrationMetadataValidator() *validator.Validate {
v := validator.New()
_ = v.RegisterValidation("onetrue", func(fl validator.FieldLevel) bool {
field := fl.Field()
param := fl.Param()
if param == "" {
panic("onetrue must contain an argument")
}
switch field.Kind() {
case reflect.Slice, reflect.Array:
elem := field.Type().Elem()
// Ignore the case where this field is not actually specified or is left empty.
if field.Len() == 0 {
return true
}
if elem.Kind() == reflect.Ptr {
elem = elem.Elem()
}
sf, ok := elem.FieldByName(param)
if !ok {
panic(fmt.Sprintf("Invalid field name %s", param))
}
if sfTyp := sf.Type; sfTyp.Kind() != reflect.Bool {
panic(fmt.Sprintf("Field %s is %s, not bool", param, sfTyp))
}
count := 0
for i := 0; i < field.Len(); i++ {
if reflect.Indirect(field.Index(i)).FieldByName(param).Bool() {
count++
}
}
return count == 1
default:
panic(fmt.Sprintf("Invalid field type %T", field.Interface()))
}
})
return v
}