func accessField()

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
}