in gotype/fold_reflect.go [206:249]
func buildFieldFold(C *foldContext, t reflect.Type, idx int) (reFoldFn, error) {
st := t.Field(idx)
name := st.Name
rune, _ := utf8.DecodeRuneInString(name)
if !unicode.IsUpper(rune) {
// ignore non exported fields
return nil, nil
}
tagName, tagOpts := parseTags(st.Tag.Get(C.opts.tag))
if tagOpts.squash && tagOpts.omitEmpty {
return nil, errInlineAndOmitEmpty
}
if tagOpts.omit {
// ignore omitted fields
return nil, nil
}
if tagOpts.squash {
return buildFieldFoldInline(C, t, idx)
}
foldT := st.Type
if tagOpts.omitEmpty {
_, foldT = baseType(st.Type)
}
valueVisitor, err := getReflectFold(C, foldT)
if err != nil {
return nil, err
}
if tagName != "" {
name = tagName
} else {
name = strings.ToLower(name)
}
if tagOpts.omitEmpty {
return makeNonEmptyFieldFold(name, idx, st.Type, valueVisitor)
}
return makeFieldFold(name, idx, valueVisitor)
}