Add proper support for error -> string and Stringer -> string.
diff --git a/cast_test.go b/cast_test.go
index 13318a4..e8cb176 100644
--- a/cast_test.go
+++ b/cast_test.go
@@ -8,8 +8,9 @@
import (
"testing"
- "github.com/stretchr/testify/assert"
"html/template"
+
+ "github.com/stretchr/testify/assert"
)
func TestToInt(t *testing.T) {
@@ -40,6 +41,35 @@
assert.Equal(t, ToString(nil), "")
}
+type foo struct {
+ val string
+}
+
+func (x foo) String() string {
+ return x.val
+}
+
+func TestStringerToString(t *testing.T) {
+
+ var x foo
+ x.val = "bar"
+ assert.Equal(t, "bar", ToString(x))
+}
+
+type fu struct {
+ val string
+}
+
+func (x fu) Error() string {
+ return x.val
+}
+
+func TestErrorToString(t *testing.T) {
+ var x fu
+ x.val = "bar"
+ assert.Equal(t, "bar", ToString(x))
+}
+
func TestMaps(t *testing.T) {
var taxonomies = map[interface{}]interface{}{"tag": "tags", "group": "groups"}
var stringMapBool = map[interface{}]interface{}{"v1": true, "v2": false}
diff --git a/caste.go b/caste.go
index d639da7..40bde04 100644
--- a/caste.go
+++ b/caste.go
@@ -119,10 +119,6 @@
}
}
-var (
- errorType = reflect.TypeOf((*error)(nil)).Elem()
- fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem()
-)
func ToStringE(i interface{}) (string, error) {
jww.DEBUG.Println("ToStringE called on type:", reflect.TypeOf(i))
@@ -140,13 +136,12 @@
return string(s), nil
case nil:
return "", nil
+ case fmt.Stringer:
+ return s.String(), nil
+ case error:
+ return s.Error(), nil
default:
- // shamelessly borrowed from html/template
- v := reflect.ValueOf(i)
- for !v.Type().Implements(fmtStringerType) && !v.Type().Implements(errorType) && v.Kind() == reflect.Ptr && !v.IsNil() {
- v = v.Elem()
- }
- return fmt.Sprint(v), nil
+ return "", fmt.Errorf("Unable to Cast %#v to string", i)
}
}