func NewIntegrationMetadataValidator()

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
}