Skip to content

Commit

Permalink
Improve UnsupportedTypeForSelector error message
Browse files Browse the repository at this point in the history
  • Loading branch information
TomWright committed Feb 24, 2021
1 parent 2c858e6 commit 6e9d685
Show file tree
Hide file tree
Showing 11 changed files with 29 additions and 27 deletions.
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion condition_equal.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 2 additions & 2 deletions error.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 2 additions & 2 deletions error_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@ 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",
Remaining: ".b.c",
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>"},
Expand Down
4 changes: 2 additions & 2 deletions node_propagate.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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}
}
4 changes: 2 additions & 2 deletions node_propagate_internal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{}{
Expand Down Expand Up @@ -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)
})
}

Expand Down
6 changes: 3 additions & 3 deletions node_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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.
Expand Down
6 changes: 3 additions & 3 deletions node_query_internal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
})
}

Expand All @@ -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)
})
}

Expand Down Expand Up @@ -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)
})
}

Expand Down
10 changes: 5 additions & 5 deletions node_query_multiple.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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 {
Expand Down
10 changes: 5 additions & 5 deletions node_query_multiple_internal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
})
}

Expand All @@ -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"})
Expand Down Expand Up @@ -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)
})
}

Expand All @@ -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)
})
}

Expand Down Expand Up @@ -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)
})
}

Expand Down
2 changes: 1 addition & 1 deletion node_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 6e9d685

Please sign in to comment.