func keysFromMessage()

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
}