Merge pull request #211 from joeybloggs/v8-development

Add minor optimization for structonly & nostructlevel checks
This commit is contained in:
Dean Karn 2015-11-20 09:03:28 -05:00
commit ba623db026
2 changed files with 17 additions and 8 deletions

13
util.go
View file

@ -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"

View file

@ -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
} }
} }