diff --git a/util.go b/util.go index 4ba6ce5..f561ea3 100644 --- a/util.go +++ b/util.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 tVals := &tagVals{tagVals: [][]string{{t}}} cTag.tags = append(cTag.tags, tVals) return true - } - if t == omitempty { + case omitempty: 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" diff --git a/validator.go b/validator.go index cf1ff21..07c6fd8 100644 --- a/validator.go +++ b/validator.go @@ -48,9 +48,11 @@ var ( ) type cachedTag struct { - isOmitEmpty bool - diveTag string - tags []*tagVals + isOmitEmpty bool + isNoStructLevel bool + isStructOnly bool + diveTag string + tags []*tagVals } type tagVals struct { @@ -597,11 +599,11 @@ func (v *Validate) traverseField(topStruct reflect.Value, currentStruct reflect. if typ != timeType { - if strings.Contains(tag, noStructLevelTag) { + if cTag.isNoStructLevel { 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 } }