From 49eac8733e425d278bcf6558bd7588473d6e8eb6 Mon Sep 17 00:00:00 2001 From: mazkev Date: Tue, 3 Nov 2026 07:34:29 +0700 Subject: [PATCH] fix: support arbitrary slices and arrays in ToSliceE --- slice.go | 25 +++++++++++++++++++++---- slice_test.go | 5 +++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/slice.go b/slice.go index e6a8328c..ee1d22f6 100644 --- a/slice.go +++ b/slice.go @@ -8,6 +8,7 @@ package cast import ( "fmt" "reflect" + "slices" "strings" ) @@ -17,13 +18,29 @@ func ToSliceE(i any) ([]any, error) { var s []any + if i == nil { + return s, fmt.Errorf(errorMsg, i, i, s) + } + switch v := i.(type) { case []any: - // TODO: use slices.Clone - return append(s, v...), nil + return slices.Clone(v), nil case []map[string]any: - for _, u := range v { - s = append(s, u) + s = make([]any, len(v)) + for idx, u := range v { + s[idx] = u + } + + return s, nil + } + + kind := reflect.TypeOf(i).Kind() + switch kind { + case reflect.Slice, reflect.Array: + val := reflect.ValueOf(i) + s = make([]any, val.Len()) + for j := 0; j < val.Len(); j++ { + s[j] = val.Index(j).Interface() } return s, nil diff --git a/slice_test.go b/slice_test.go index fb7597cc..28370fee 100644 --- a/slice_test.go +++ b/slice_test.go @@ -233,6 +233,11 @@ func TestSlice(t *testing.T) { testCases := []testCase{ {[]any{1, 3}, []any{1, 3}, false}, {[]map[string]any{{"k1": 1}, {"k2": 2}}, []any{map[string]any{"k1": 1}, map[string]any{"k2": 2}}, false}, + {[]string{"foo", "bar"}, []any{"foo", "bar"}, false}, + {[]int{1, 2}, []any{1, 2}, false}, + {[]bool{true, false}, []any{true, false}, false}, + {[2]string{"a", "b"}, []any{"a", "b"}, false}, + {[2]int{10, 20}, []any{10, 20}, false}, // Failure cases {nil, nil, true},