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 fa1ea23..8f6d40b 100644 --- a/cast_test.go +++ b/cast_test.go @@ -141,6 +141,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 9475ca7..38d03de 100644 --- a/caste.go +++ b/caste.go @@ -422,6 +422,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.TRACE.Println("ToStringSliceE called on type:", reflect.TypeOf(i))