add required_without validator

pull/469/head
A Mashmooli 5 years ago
parent ebfddc5784
commit 03bfd38cc1
  1. 42
      baked_in.go
  2. 20
      validator_test.go

@ -65,6 +65,7 @@ var (
"required": hasValue,
"required_with": requiredWith,
"required_with_all": requiredWithAll,
"required_without": requiredWithout,
"isdefault": isDefault,
"len": hasLengthOf,
"min": hasMinOf,
@ -1393,6 +1394,47 @@ func requiredWithAll(fl FieldLevel) bool {
return true
}
// RequiredWithout is the validation function
// The field under validation must be present and not empty only when any of the other specified fields are not present.
func requiredWithout(fl FieldLevel) bool {
field := fl.Field()
isValidateCurrentField := false
params := parseOneOfParam2(fl.Param())
for _, param := range params {
isParamFieldPresent := false
paramField := fl.Parent().FieldByName(param)
switch paramField.Kind() {
case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func:
isParamFieldPresent = !paramField.IsNil()
default:
if fl.(*validate).fldIsPointer && paramField.Interface() != nil {
isParamFieldPresent = true
}
isParamFieldPresent = paramField.IsValid() && paramField.Interface() != reflect.Zero(field.Type()).Interface()
}
if isParamFieldPresent {
isValidateCurrentField = isParamFieldPresent
}
}
if !isValidateCurrentField {
switch field.Kind() {
case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func:
return !field.IsNil()
default:
if fl.(*validate).fldIsPointer && field.Interface() != nil {
return true
}
return field.IsValid() && field.Interface() != reflect.Zero(field.Type()).Interface()
}
}
return true
}
// IsGteField is the validation function for validating if the current field's value is greater than or equal to the field specified by the param's value.
func isGteField(fl FieldLevel) bool {

@ -8627,7 +8627,6 @@ func TestRequiredWith(t *testing.T) {
Field3 string `validate:"required_with=Field1 Field2" json:"field_3"`
}{
Field1: "test_field1",
Field2: "test_field2",
Field3: "test_field3",
}
@ -8660,3 +8659,22 @@ func TestRequiredWithAll(t *testing.T) {
t.Fatalf("failed Error: %s", errs)
}
}
func TestRequiredWithout(t *testing.T) {
test := struct {
Field1 string `validate:"omitempty" json:"field_1"`
Field2 string `validate:"omitempty" json:"field_2"`
Field3 string `validate:"required_without=Field1 Field2" json:"field_3"`
}{
Field3: "test_field3",
}
validate := New()
errs := validate.Struct(test)
if errs != nil {
t.Fatalf("failed Error: %s", errs)
}
}

Loading…
Cancel
Save