mirror of
https://github.com/Fishwaldo/validator.git
synced 2025-03-20 22:21:43 +00:00
Merge pull request #209 from joeybloggs/v8-development
Add nostructlevel tag
This commit is contained in:
commit
aea222d51c
4 changed files with 41 additions and 0 deletions
3
doc.go
3
doc.go
|
@ -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.
|
||||||
|
|
1
util.go
1
util.go
|
@ -26,6 +26,7 @@ var (
|
||||||
skipValidationTag: emptyStructPtr,
|
skipValidationTag: emptyStructPtr,
|
||||||
utf8HexComma: emptyStructPtr,
|
utf8HexComma: emptyStructPtr,
|
||||||
utf8Pipe: emptyStructPtr,
|
utf8Pipe: emptyStructPtr,
|
||||||
|
noStructLevelTag: emptyStructPtr,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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",
|
||||||
|
|
Loading…
Add table
Reference in a new issue