in object.go [430:459]
func findField(name string, typ reflect.Type) ([]int, *reflect.StructField, error) {
for i := 0; i < typ.NumField(); i++ {
// matching tag first, then lowerCamelCase, SameCase, lowerCase
typField := typ.Field(i)
tagVal, hasTag := typField.Tag.Lookup(tagIdentifier)
fieldName := typField.Name
if hasTag && tagVal == name ||
fieldName == name ||
lowerCamelCase(fieldName) == name ||
strings.ToLower(fieldName) == name {
return []int{i}, &typField, nil
}
if typField.Anonymous && typField.Type.Kind() == reflect.Struct {
next, field, _ := findField(name, typField.Type)
if len(next) > 0 {
indexes := []int{i}
indexes = append(indexes, next...)
return indexes, field, nil
}
}
}
return []int{}, nil, perrors.Errorf("failed to find field %s", name)
}