mirror of
https://github.com/Fishwaldo/validator.git
synced 2025-03-18 21:21:38 +00:00
Merge pull request #210 from go-playground/v8-development
Add nostructlevel tag
This commit is contained in:
commit
82faf6f72a
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.
|
||||
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
|
||||
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.
|
||||
|
|
1
util.go
1
util.go
|
@ -26,6 +26,7 @@ var (
|
|||
skipValidationTag: emptyStructPtr,
|
||||
utf8HexComma: emptyStructPtr,
|
||||
utf8Pipe: emptyStructPtr,
|
||||
noStructLevelTag: emptyStructPtr,
|
||||
}
|
||||
)
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@ const (
|
|||
orSeparator = "|"
|
||||
tagKeySeparator = "="
|
||||
structOnlyTag = "structonly"
|
||||
noStructLevelTag = "nostructlevel"
|
||||
omitempty = "omitempty"
|
||||
skipValidationTag = "-"
|
||||
diveTag = "dive"
|
||||
|
@ -595,6 +596,11 @@ func (v *Validate) traverseField(topStruct reflect.Value, currentStruct reflect.
|
|||
typ = current.Type()
|
||||
|
||||
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))
|
||||
return
|
||||
}
|
||||
|
|
|
@ -3493,6 +3493,36 @@ func TestBase64Validation(t *testing.T) {
|
|||
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) {
|
||||
|
||||
type Inner struct {
|
||||
|
@ -3509,6 +3539,7 @@ func TestStructOnlyValidation(t *testing.T) {
|
|||
|
||||
errs := validate.Struct(outer)
|
||||
NotEqual(t, errs, nil)
|
||||
AssertError(t, errs, "Outer.InnerStruct", "InnerStruct", "required")
|
||||
|
||||
inner := &Inner{
|
||||
Test: "1234",
|
||||
|
|
Loading…
Add table
Reference in a new issue