mirror of
https://github.com/TomWright/dasel.git
synced 2022-05-22 02:32:45 +03:00
Improve UnsupportedTypeForSelector error message
This commit is contained in:
@@ -7,7 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
- Nothing yet.
|
||||
### Changed
|
||||
|
||||
- Improved information provided in `UnsupportedTypeForSelector` errors.
|
||||
|
||||
## [v1.13.1] - 2021-02-18
|
||||
|
||||
|
||||
@@ -42,5 +42,5 @@ func (c EqualCondition) Check(other reflect.Value) (bool, error) {
|
||||
return fmt.Sprint(foundNode.InterfaceValue()) == c.Value, nil
|
||||
}
|
||||
|
||||
return false, &UnhandledCheckType{Value: value.Kind().String()}
|
||||
return false, &UnhandledCheckType{Value: value.String()}
|
||||
}
|
||||
|
||||
4
error.go
4
error.go
@@ -42,12 +42,12 @@ func (e UnsupportedSelector) Error() string {
|
||||
// UnsupportedTypeForSelector is returned when a selector attempts to handle a data type it can't handle.
|
||||
type UnsupportedTypeForSelector struct {
|
||||
Selector Selector
|
||||
Value interface{}
|
||||
Value reflect.Value
|
||||
}
|
||||
|
||||
// Error returns the error message.
|
||||
func (e UnsupportedTypeForSelector) Error() string {
|
||||
return fmt.Sprintf("selector [%s] does not support value: %T: %v", e.Selector.Type, e.Value, e.Value)
|
||||
return fmt.Sprintf("selector [type:%s selector:%s] does not support value: [kind:%s type:%T] %v", e.Selector.Type, e.Selector.Raw, e.Value.Kind().String(), e.Value.Interface(), e.Value.Interface())
|
||||
}
|
||||
|
||||
// ValueNotFound is returned when a selector string cannot be fully resolved.
|
||||
|
||||
@@ -16,7 +16,7 @@ func TestErrorMessages(t *testing.T) {
|
||||
{In: &dasel.InvalidIndexErr{Index: "1"}, Out: "invalid index: 1"},
|
||||
{In: &dasel.UnsupportedSelector{Selector: "..."}, Out: "selector is not supported here: ..."},
|
||||
{In: &dasel.UnsupportedTypeForSelector{
|
||||
Value: map[string]interface{}{},
|
||||
Value: reflect.ValueOf(map[string]interface{}{}),
|
||||
Selector: dasel.Selector{
|
||||
Raw: ".a.b.c",
|
||||
Current: ".a",
|
||||
@@ -24,7 +24,7 @@ func TestErrorMessages(t *testing.T) {
|
||||
Type: "INDEX",
|
||||
Index: 1,
|
||||
},
|
||||
}, Out: "selector [INDEX] does not support value: map[string]interface {}: map[]"},
|
||||
}, Out: "selector [type:INDEX selector:.a.b.c] does not support value: [kind:map type:map[string]interface {}] map[]"},
|
||||
{In: &dasel.ValueNotFound{
|
||||
Selector: ".name",
|
||||
}, Out: "no value found for selector: .name: <invalid reflect.Value>"},
|
||||
|
||||
@@ -68,7 +68,7 @@ func propagateValueIndex(n *Node) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &UnsupportedTypeForSelector{Selector: n.Selector, Value: value.Kind()}
|
||||
return &UnsupportedTypeForSelector{Selector: n.Selector, Value: value}
|
||||
}
|
||||
|
||||
// propagateValueNextAvailableIndex sends the value of the current node up to the previous node in the chain.
|
||||
@@ -84,5 +84,5 @@ func propagateValueNextAvailableIndex(n *Node) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &UnsupportedTypeForSelector{Selector: n.Selector, Value: value.Kind()}
|
||||
return &UnsupportedTypeForSelector{Selector: n.Selector, Value: value}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ func TestPropagateValueIndex(t *testing.T) {
|
||||
n.Selector.Current = "[0]"
|
||||
n.Selector.Index = 0
|
||||
err := propagateValueIndex(n)
|
||||
assertErrResult(t, &UnsupportedTypeForSelector{Selector: n.Selector, Value: reflect.TypeOf(val).Kind()}, err)
|
||||
assertErrResult(t, &UnsupportedTypeForSelector{Selector: n.Selector, Value: reflect.ValueOf(val)}, err)
|
||||
})
|
||||
t.Run("ExistingIndex", func(t *testing.T) {
|
||||
val := []interface{}{
|
||||
@@ -65,7 +65,7 @@ func TestPropagateValueNextAvailableIndex(t *testing.T) {
|
||||
val := map[string]interface{}{}
|
||||
n := getNodeWithValue(val)
|
||||
err := propagateValueNextAvailableIndex(n)
|
||||
assertErrResult(t, &UnsupportedTypeForSelector{Selector: n.Selector, Value: reflect.TypeOf(val).Kind()}, err)
|
||||
assertErrResult(t, &UnsupportedTypeForSelector{Selector: n.Selector, Value: reflect.ValueOf(val)}, err)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ func findValueProperty(n *Node, createIfNotExists bool) (reflect.Value, error) {
|
||||
return nilValue(), &ValueNotFound{Selector: n.Selector.Current, PreviousValue: n.Previous.Value}
|
||||
}
|
||||
|
||||
return nilValue(), &UnsupportedTypeForSelector{Selector: n.Selector, Value: n.Previous.Value.Type().Kind()}
|
||||
return nilValue(), &UnsupportedTypeForSelector{Selector: n.Selector, Value: value}
|
||||
}
|
||||
|
||||
// findValueIndex finds the value for the given node using the index selector
|
||||
@@ -101,7 +101,7 @@ func findValueIndex(n *Node, createIfNotExists bool) (reflect.Value, error) {
|
||||
return nilValue(), &ValueNotFound{Selector: n.Selector.Current, PreviousValue: n.Previous.Value}
|
||||
}
|
||||
|
||||
return nilValue(), &UnsupportedTypeForSelector{Selector: n.Selector, Value: value.Kind()}
|
||||
return nilValue(), &UnsupportedTypeForSelector{Selector: n.Selector, Value: value}
|
||||
}
|
||||
|
||||
// findNextAvailableIndex finds the value for the given node using the index selector
|
||||
@@ -180,7 +180,7 @@ func findValueDynamic(n *Node, createIfNotExists bool) (reflect.Value, error) {
|
||||
return nilValue(), &ValueNotFound{Selector: n.Selector.Current, PreviousValue: n.Previous.Value}
|
||||
}
|
||||
|
||||
return nilValue(), &UnsupportedTypeForSelector{Selector: n.Selector, Value: value.Kind()}
|
||||
return nilValue(), &UnsupportedTypeForSelector{Selector: n.Selector, Value: value}
|
||||
}
|
||||
|
||||
// findValue finds the value for the given node.
|
||||
|
||||
@@ -59,7 +59,7 @@ func TestFindValueProperty(t *testing.T) {
|
||||
n := getNodeWithValue(val)
|
||||
n.Selector.Current = "x"
|
||||
got, err := findValueProperty(n, false)
|
||||
assertQueryResult(t, nilValue(), &UnsupportedTypeForSelector{Selector: n.Selector, Value: reflect.TypeOf(val).Kind()}, got, err)
|
||||
assertQueryResult(t, nilValue(), &UnsupportedTypeForSelector{Selector: n.Selector, Value: reflect.ValueOf(val)}, got, err)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ func TestFindValueIndex(t *testing.T) {
|
||||
n.Selector.Current = "[0]"
|
||||
n.Selector.Index = 0
|
||||
got, err := findValueIndex(n, false)
|
||||
assertQueryResult(t, nilValue(), &UnsupportedTypeForSelector{Selector: n.Selector, Value: reflect.TypeOf(val).Kind()}, got, err)
|
||||
assertQueryResult(t, nilValue(), &UnsupportedTypeForSelector{Selector: n.Selector, Value: reflect.ValueOf(val)}, got, err)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -171,7 +171,7 @@ func TestFindValueDynamic(t *testing.T) {
|
||||
&EqualCondition{Key: "name", Value: "x"},
|
||||
}
|
||||
got, err := findValueDynamic(n, false)
|
||||
assertQueryResult(t, nilValue(), &UnsupportedTypeForSelector{Selector: n.Selector, Value: reflect.TypeOf(val).Kind()}, got, err)
|
||||
assertQueryResult(t, nilValue(), &UnsupportedTypeForSelector{Selector: n.Selector, Value: reflect.ValueOf(val)}, got, err)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@ func findNodesProperty(selector Selector, previousValue reflect.Value, createIfN
|
||||
return nil, &ValueNotFound{Selector: selector.Current, PreviousValue: previousValue}
|
||||
}
|
||||
|
||||
return nil, &UnsupportedTypeForSelector{Selector: selector, Value: previousValue.Type().Kind()}
|
||||
return nil, &UnsupportedTypeForSelector{Selector: selector, Value: value}
|
||||
}
|
||||
|
||||
func findNodesPropertyKeys(selector Selector, previousValue reflect.Value, createIfNotExists bool) ([]*Node, error) {
|
||||
@@ -132,7 +132,7 @@ func findNodesPropertyKeys(selector Selector, previousValue reflect.Value, creat
|
||||
})
|
||||
}
|
||||
default:
|
||||
return nil, &UnsupportedTypeForSelector{Selector: selector, Value: previousValue.Kind()}
|
||||
return nil, &UnsupportedTypeForSelector{Selector: selector, Value: value}
|
||||
}
|
||||
|
||||
return results, nil
|
||||
@@ -163,7 +163,7 @@ func findNodesIndex(selector Selector, previousValue reflect.Value, createIfNotE
|
||||
return nil, &ValueNotFound{Selector: selector.Current, PreviousValue: previousValue}
|
||||
}
|
||||
|
||||
return nil, &UnsupportedTypeForSelector{Selector: selector, Value: value.Kind()}
|
||||
return nil, &UnsupportedTypeForSelector{Selector: selector, Value: value}
|
||||
}
|
||||
|
||||
// findNextAvailableIndexNodes finds the value for the given node using the index selector
|
||||
@@ -265,7 +265,7 @@ func findNodesDynamic(selector Selector, previousValue reflect.Value, createIfNo
|
||||
return nil, &ValueNotFound{Selector: selector.Current, PreviousValue: previousValue}
|
||||
}
|
||||
|
||||
return nil, &UnsupportedTypeForSelector{Selector: selector, Value: value.Kind()}
|
||||
return nil, &UnsupportedTypeForSelector{Selector: selector, Value: value}
|
||||
}
|
||||
|
||||
func findNodesSearchRecursiveSubNode(selector Selector, subNode *Node, key string, createIfNotExists bool) ([]*Node, error) {
|
||||
@@ -413,7 +413,7 @@ func findNodesAnyIndex(selector Selector, previousValue reflect.Value) ([]*Node,
|
||||
return nil, &ValueNotFound{Selector: selector.Current, PreviousValue: previousValue}
|
||||
}
|
||||
|
||||
return nil, &UnsupportedTypeForSelector{Selector: selector, Value: value.Kind()}
|
||||
return nil, &UnsupportedTypeForSelector{Selector: selector, Value: value}
|
||||
}
|
||||
|
||||
func initialiseEmptyValue(selector Selector, previousValue reflect.Value) reflect.Value {
|
||||
|
||||
@@ -89,7 +89,7 @@ func TestFindNodesProperty(t *testing.T) {
|
||||
previousValue := reflect.ValueOf(0)
|
||||
selector := Selector{Current: "x"}
|
||||
got, err := findNodesProperty(selector, previousValue, false)
|
||||
assertQueryMultipleResult(t, []reflect.Value{}, &UnsupportedTypeForSelector{Selector: selector, Value: previousValue.Kind()}, got, err)
|
||||
assertQueryMultipleResult(t, []reflect.Value{}, &UnsupportedTypeForSelector{Selector: selector, Value: previousValue}, got, err)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -108,7 +108,7 @@ func TestFindNodesPropertyKeys(t *testing.T) {
|
||||
previousValue := reflect.ValueOf(0)
|
||||
selector := Selector{Current: "x"}
|
||||
got, err := findNodesPropertyKeys(selector, previousValue, false)
|
||||
assertQueryMultipleResult(t, []reflect.Value{}, &UnsupportedTypeForSelector{Selector: selector, Value: previousValue.Kind()}, got, err)
|
||||
assertQueryMultipleResult(t, []reflect.Value{}, &UnsupportedTypeForSelector{Selector: selector, Value: previousValue}, got, err)
|
||||
})
|
||||
t.Run("SliceValue", func(t *testing.T) {
|
||||
previousValue := reflect.ValueOf([]interface{}{"a", "b", "c"})
|
||||
@@ -155,7 +155,7 @@ func TestFindNodesIndex(t *testing.T) {
|
||||
selector := Selector{Current: "[0]", Index: 0, Raw: ".[0]"}
|
||||
previousValue := reflect.ValueOf(map[string]interface{}{})
|
||||
got, err := findNodesIndex(selector, previousValue, false)
|
||||
assertQueryMultipleResult(t, []reflect.Value{}, &UnsupportedTypeForSelector{Selector: selector, Value: previousValue.Kind()}, got, err)
|
||||
assertQueryMultipleResult(t, []reflect.Value{}, &UnsupportedTypeForSelector{Selector: selector, Value: previousValue}, got, err)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -181,7 +181,7 @@ func TestFindNodesAnyIndex(t *testing.T) {
|
||||
selector := Selector{Current: "[*]", Raw: ".[*]"}
|
||||
previousValue := reflect.ValueOf(0)
|
||||
got, err := findNodesAnyIndex(selector, previousValue)
|
||||
assertQueryMultipleResult(t, []reflect.Value{}, &UnsupportedTypeForSelector{Selector: selector, Value: previousValue.Kind()}, got, err)
|
||||
assertQueryMultipleResult(t, []reflect.Value{}, &UnsupportedTypeForSelector{Selector: selector, Value: previousValue}, got, err)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -276,7 +276,7 @@ func TestFindNodesDynamic(t *testing.T) {
|
||||
},
|
||||
}
|
||||
got, err := findNodesDynamic(selector, previousValue, false)
|
||||
assertQueryMultipleResult(t, []reflect.Value{}, &UnsupportedTypeForSelector{Selector: selector, Value: previousValue.Kind()}, got, err)
|
||||
assertQueryMultipleResult(t, []reflect.Value{}, &UnsupportedTypeForSelector{Selector: selector, Value: previousValue}, got, err)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -501,7 +501,7 @@ func TestNode_Query(t *testing.T) {
|
||||
})
|
||||
t.Run("NotFound", func(t *testing.T) {
|
||||
_, err := dasel.New(value).Query(".colours.[0].a")
|
||||
expErr := fmt.Errorf("could not find value: selector [PROPERTY] does not support value: reflect.Kind: interface")
|
||||
expErr := fmt.Errorf("could not find value: selector [type:PROPERTY selector:.a] does not support value: [kind:string type:string] red")
|
||||
if err == nil {
|
||||
t.Errorf("expected err %v, got %v", expErr, err)
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user