From 1c4fc488b671185b8b35972a2b4bfa0b6675152f Mon Sep 17 00:00:00 2001 From: Matt Keller Date: Sat, 23 Apr 2016 19:19:37 -0400 Subject: [PATCH] Add a ToBoolSlice() and necessary plumbing Resolves #1 as ToIntSlice() is already present. --- cast.go | 5 +++++ cast_test.go | 4 ++++ caste.go | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/cast.go b/cast.go index de5a686..6ca3e0e 100644 --- a/cast.go +++ b/cast.go @@ -67,6 +67,11 @@ func ToSlice(i interface{}) []interface{} { return v } +func ToBoolSlice(i interface{}) []bool { + v, _ := ToBoolSliceE(i) + return v +} + func ToStringSlice(i interface{}) []string { v, _ := ToStringSliceE(i) return v diff --git a/cast_test.go b/cast_test.go index 3fbcf87..242b676 100644 --- a/cast_test.go +++ b/cast_test.go @@ -137,6 +137,10 @@ func TestSlices(t *testing.T) { 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"})) + assert.Equal(t, []bool{true, false, true}, ToBoolSlice([]bool{true, false, true})) + assert.Equal(t, []bool{true, false, true}, ToBoolSlice([]interface{}{true, false, true})) + assert.Equal(t, []bool{true, false, true}, ToBoolSlice([]int{1,0,1})) + assert.Equal(t, []bool{true, false, true}, ToBoolSlice([]string{"true","false","true"})) } func TestToBool(t *testing.T) { diff --git a/caste.go b/caste.go index 2377896..caaa932 100644 --- a/caste.go +++ b/caste.go @@ -411,6 +411,38 @@ func ToSliceE(i interface{}) ([]interface{}, error) { } } +// ToBoolSliceE casts an empty interface to a []bool. +func ToBoolSliceE(i interface{}) ([]bool, error) { + jww.DEBUG.Println("ToBoolSliceE called on type:", reflect.TypeOf(i)) + + if i == nil { + return []bool{}, fmt.Errorf("Unable to Cast %#v to []bool", i) + } + + switch v := i.(type) { + case []bool: + return v, nil + } + + kind := reflect.TypeOf(i).Kind() + switch kind { + case reflect.Slice, reflect.Array: + s := reflect.ValueOf(i) + a := make([]bool, s.Len()) + for j := 0; j < s.Len(); j++ { + val, err := ToBoolE(s.Index(j).Interface()) + if err != nil { + return []bool{}, fmt.Errorf("Unable to Cast %#v to []bool", i) + } + a[j] = val + } + return a, nil + default: + return []bool{}, fmt.Errorf("Unable to Cast %#v to []bool", i) + } +} + + // ToStringSliceE casts an empty interface to a []string. func ToStringSliceE(i interface{}) ([]string, error) { jww.DEBUG.Println("ToStringSliceE called on type:", reflect.TypeOf(i))