Merge pull request #209 from joeybloggs/v8-development

Add nostructlevel tag
This commit is contained in:
Dean Karn 2015-11-19 16:46:18 -05:00
commit aea222d51c
4 changed files with 41 additions and 0 deletions

3
doc.go
View file

@ -138,6 +138,9 @@ Here is a list of the current built in validators:
you know the struct will be valid, but need to verify it has been assigned. you know the struct will be valid, but need to verify it has been assigned.
NOTE: only "required" and "omitempty" can be used on a struct itself. NOTE: only "required" and "omitempty" can be used on a struct itself.
nostructlevel
Same as structonly tag except that any struct level validations will not run.
exists exists
Is a special tag without a validation function attached. It is used when a field Is a special tag without a validation function attached. It is used when a field
is a Pointer, Interface or Invalid and you wish to validate that it exists. is a Pointer, Interface or Invalid and you wish to validate that it exists.

View file

@ -26,6 +26,7 @@ var (
skipValidationTag: emptyStructPtr, skipValidationTag: emptyStructPtr,
utf8HexComma: emptyStructPtr, utf8HexComma: emptyStructPtr,
utf8Pipe: emptyStructPtr, utf8Pipe: emptyStructPtr,
noStructLevelTag: emptyStructPtr,
} }
) )

View file

@ -26,6 +26,7 @@ const (
orSeparator = "|" orSeparator = "|"
tagKeySeparator = "=" tagKeySeparator = "="
structOnlyTag = "structonly" structOnlyTag = "structonly"
noStructLevelTag = "nostructlevel"
omitempty = "omitempty" omitempty = "omitempty"
skipValidationTag = "-" skipValidationTag = "-"
diveTag = "dive" diveTag = "dive"
@ -595,6 +596,11 @@ func (v *Validate) traverseField(topStruct reflect.Value, currentStruct reflect.
typ = current.Type() typ = current.Type()
if typ != timeType { if typ != timeType {
if strings.Contains(tag, noStructLevelTag) {
return
}
v.tranverseStruct(topStruct, current, current, errPrefix+name+".", errs, false, partial, exclude, includeExclude, strings.Contains(tag, structOnlyTag)) v.tranverseStruct(topStruct, current, current, errPrefix+name+".", errs, false, partial, exclude, includeExclude, strings.Contains(tag, structOnlyTag))
return return
} }

View file

@ -3493,6 +3493,36 @@ func TestBase64Validation(t *testing.T) {
AssertError(t, errs, "", "", "base64") AssertError(t, errs, "", "", "base64")
} }
func TestNoStructLevelValidation(t *testing.T) {
type Inner struct {
Test string `validate:"len=5"`
}
type Outer struct {
InnerStruct *Inner `validate:"required,nostructlevel"`
}
outer := &Outer{
InnerStruct: nil,
}
errs := validate.Struct(outer)
NotEqual(t, errs, nil)
AssertError(t, errs, "Outer.InnerStruct", "InnerStruct", "required")
inner := &Inner{
Test: "1234",
}
outer = &Outer{
InnerStruct: inner,
}
errs = validate.Struct(outer)
Equal(t, errs, nil)
}
func TestStructOnlyValidation(t *testing.T) { func TestStructOnlyValidation(t *testing.T) {
type Inner struct { type Inner struct {
@ -3509,6 +3539,7 @@ func TestStructOnlyValidation(t *testing.T) {
errs := validate.Struct(outer) errs := validate.Struct(outer)
NotEqual(t, errs, nil) NotEqual(t, errs, nil)
AssertError(t, errs, "Outer.InnerStruct", "InnerStruct", "required")
inner := &Inner{ inner := &Inner{
Test: "1234", Test: "1234",