in gotype/fold_reflect.go [41:84]
func getReflectFold(c *foldContext, t reflect.Type) (reFoldFn, error) {
var err error
f := c.reg.find(t)
if f != nil {
return f, nil
}
f = getReflectFoldPrimitive(t)
if f != nil {
c.reg.set(t, f)
return f, nil
}
if implementsFolder(t) || implementsPtrFolder(t) {
f := reFoldFolderIfc
c.reg.set(t, f)
return f, nil
}
switch t.Kind() {
case reflect.Ptr:
f, err = getFoldPointer(c, t)
case reflect.Struct:
f, err = getReflectFoldStruct(c, t, false)
case reflect.Map:
f, err = getReflectFoldMap(c, t)
case reflect.Slice, reflect.Array:
f, err = getReflectFoldSlice(c, t)
case reflect.Interface:
f, err = getReflectFoldElem(c, t)
default:
f, err = getReflectFoldPrimitiveKind(t)
if err != nil {
return nil, err
}
}
if err != nil {
return nil, err
}
c.reg.set(t, f)
return f, nil
}