From 4d07383ffe94b5e5a6fa3af9211374a4507a0184 Mon Sep 17 00:00:00 2001 From: bep Date: Wed, 25 Feb 2015 14:50:44 +0100 Subject: [PATCH] Make ToIntSliceE more flexible Now it accepts any slice or array type that contains a type supported by ToIntE. [close #12] --- cast_test.go | 2 ++ caste.go | 28 ++++++++++++++++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/cast_test.go b/cast_test.go index b4c8382..3fa717f 100644 --- a/cast_test.go +++ b/cast_test.go @@ -82,6 +82,8 @@ func TestSlices(t *testing.T) { assert.Equal(t, []string{"1", "3"}, ToStringSlice([]interface{}{1, 3})) assert.Equal(t, []int{1, 3}, ToIntSlice([]int{1, 3})) assert.Equal(t, []int{1, 3}, ToIntSlice([]interface{}{1.2, 3.2})) + assert.Equal(t, []int{2, 3}, ToIntSlice([]string{"2", "3"})) + assert.Equal(t, []int{2, 3}, ToIntSlice([2]string{"2", "3"})) } func TestToBool(t *testing.T) { diff --git a/caste.go b/caste.go index db8b9fb..58d72df 100644 --- a/caste.go +++ b/caste.go @@ -321,21 +321,33 @@ func ToStringSliceE(i interface{}) ([]string, error) { func ToIntSliceE(i interface{}) ([]int, error) { jww.DEBUG.Println("ToIntSliceE called on type:", reflect.TypeOf(i)) - var a []int + if i == nil { + return []int{}, fmt.Errorf("Unable to Cast %#v to []int", i) + } switch v := i.(type) { - case []interface{}: - for _, u := range v { - a = append(a, ToInt(u)) - } - return a, nil case []int: return v, nil + } + + kind := reflect.TypeOf(i).Kind() + switch kind { + case reflect.Slice, reflect.Array: + s := reflect.ValueOf(i) + a := make([]int, s.Len()) + for j := 0; j < s.Len(); j++ { + val, err := ToIntE(s.Index(j).Interface()) + if err != nil { + return []int{}, fmt.Errorf("Unable to Cast %#v to []int", i) + } + a[j] = val + } + return a, nil default: - return a, fmt.Errorf("Unable to Cast %#v to []int", i) + return []int{}, fmt.Errorf("Unable to Cast %#v to []int", i) } - return a, fmt.Errorf("Unable to Cast %#v to []int", i) + return []int{}, fmt.Errorf("Unable to Cast %#v to []int", i) } func StringToDate(s string) (time.Time, error) {