in grpcgcp/gcp_picker.go [219:249]
func keysFromMessage(val reflect.Value, path []string, start int) ([]string, error) {
if val.Kind() == reflect.Pointer || val.Kind() == reflect.Interface {
val = val.Elem()
}
if len(path) == start {
if val.Kind() != reflect.String {
return nil, fmt.Errorf("cannot get string value from %q which is %q", strings.Join(path, "."), val.Kind())
}
return []string{val.String()}, nil
}
if val.Kind() != reflect.Struct {
return nil, fmt.Errorf("path %q traversal error: cannot lookup field %q (index %d in the path) in a %q value", strings.Join(path, "."), path[start], start, val.Kind())
}
valField := val.FieldByName(strings.Title(path[start]))
if valField.Kind() != reflect.Slice {
return keysFromMessage(valField, path, start+1)
}
keys := []string{}
for i := 0; i < valField.Len(); i++ {
kk, err := keysFromMessage(valField.Index(i), path, start+1)
if err != nil {
return keys, err
}
keys = append(keys, kk...)
}
return keys, nil
}