in util.go [188:221]
func accessField(structVal reflect.Value, fieldIdx int, opts *options) (fieldInfo, bool, Error) {
stField := structVal.Type().Field(fieldIdx)
// ignore non exported fields
if rune, _ := utf8.DecodeRuneInString(stField.Name); !unicode.IsUpper(rune) {
return fieldInfo{}, true, nil
}
name, tagOpts := parseTags(stField.Tag.Get(opts.tag))
if tagOpts.ignore {
return fieldInfo{}, true, nil
}
// create new context, overwriting configValueHandling for all sub-operations
if tagOpts.cfgHandling != opts.configValueHandling {
tmp := &options{}
*tmp = *opts
tmp.configValueHandling = tagOpts.cfgHandling
opts = tmp
}
validators, err := parseValidatorTags(stField.Tag.Get(opts.validatorTag))
if err != nil {
return fieldInfo{}, false, raiseCritical(err, "")
}
return fieldInfo{
name: fieldName(name, stField.Name),
ftype: stField.Type,
value: structVal.Field(fieldIdx),
options: opts,
tagOptions: tagOpts,
validatorTags: validators,
}, false, nil
}