Add minor optimization for structonly & nostructlevel checks

pull/211/head
joeybloggs 9 years ago
parent 24c1c6819f
commit cab69bdd13
  1. 13
      util.go
  2. 12
      validator.go

@ -271,15 +271,22 @@ func (v *Validate) parseTagsRecursive(cTag *cachedTag, tag, fieldName, alias str
} }
} }
if t == diveTag { switch t {
case diveTag:
cTag.diveTag = tag cTag.diveTag = tag
tVals := &tagVals{tagVals: [][]string{{t}}} tVals := &tagVals{tagVals: [][]string{{t}}}
cTag.tags = append(cTag.tags, tVals) cTag.tags = append(cTag.tags, tVals)
return true return true
}
if t == omitempty { case omitempty:
cTag.isOmitEmpty = true cTag.isOmitEmpty = true
case structOnlyTag:
cTag.isStructOnly = true
case noStructLevelTag:
cTag.isNoStructLevel = true
} }
// if a pipe character is needed within the param you must use the utf8Pipe representation "0x7C" // if a pipe character is needed within the param you must use the utf8Pipe representation "0x7C"

@ -48,9 +48,11 @@ var (
) )
type cachedTag struct { type cachedTag struct {
isOmitEmpty bool isOmitEmpty bool
diveTag string isNoStructLevel bool
tags []*tagVals isStructOnly bool
diveTag string
tags []*tagVals
} }
type tagVals struct { type tagVals struct {
@ -597,11 +599,11 @@ func (v *Validate) traverseField(topStruct reflect.Value, currentStruct reflect.
if typ != timeType { if typ != timeType {
if strings.Contains(tag, noStructLevelTag) { if cTag.isNoStructLevel {
return 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, cTag.isStructOnly)
return return
} }
} }

Loading…
Cancel
Save