Add proper support for error -> string and Stringer -> string.
This commit is contained in:
		
							parent
							
								
									8dde8855a1
								
							
						
					
					
						commit
						0c3b98469e
					
				
							
								
								
									
										32
									
								
								cast_test.go
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								cast_test.go
									
									
									
									
									
								
							@ -8,8 +8,9 @@ package cast
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
					 | 
				
			||||||
	"html/template"
 | 
						"html/template"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestToInt(t *testing.T) {
 | 
					func TestToInt(t *testing.T) {
 | 
				
			||||||
@ -40,6 +41,35 @@ func TestToString(t *testing.T) {
 | 
				
			|||||||
	assert.Equal(t, ToString(nil), "")
 | 
						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) {
 | 
					func TestMaps(t *testing.T) {
 | 
				
			||||||
	var taxonomies = map[interface{}]interface{}{"tag": "tags", "group": "groups"}
 | 
						var taxonomies = map[interface{}]interface{}{"tag": "tags", "group": "groups"}
 | 
				
			||||||
	var stringMapBool = map[interface{}]interface{}{"v1": true, "v2": false}
 | 
						var stringMapBool = map[interface{}]interface{}{"v1": true, "v2": false}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										15
									
								
								caste.go
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								caste.go
									
									
									
									
									
								
							@ -119,10 +119,6 @@ func ToIntE(i interface{}) (int, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	errorType       = reflect.TypeOf((*error)(nil)).Elem()
 | 
					 | 
				
			||||||
	fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem()
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ToStringE(i interface{}) (string, error) {
 | 
					func ToStringE(i interface{}) (string, error) {
 | 
				
			||||||
	jww.DEBUG.Println("ToStringE called on type:", reflect.TypeOf(i))
 | 
						jww.DEBUG.Println("ToStringE called on type:", reflect.TypeOf(i))
 | 
				
			||||||
@ -140,13 +136,12 @@ func ToStringE(i interface{}) (string, error) {
 | 
				
			|||||||
		return string(s), nil
 | 
							return string(s), nil
 | 
				
			||||||
	case nil:
 | 
						case nil:
 | 
				
			||||||
		return "", nil
 | 
							return "", nil
 | 
				
			||||||
 | 
						case fmt.Stringer:
 | 
				
			||||||
 | 
							return s.String(), nil
 | 
				
			||||||
 | 
						case error:
 | 
				
			||||||
 | 
							return s.Error(), nil
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		// shamelessly borrowed from html/template
 | 
							return "", fmt.Errorf("Unable to Cast %#v to string", i)
 | 
				
			||||||
		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
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user