diff --git a/builtin/builtin.go b/builtin/builtin.go index 87e73614..eb8a77d2 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -996,6 +996,19 @@ var Builtins = []*Function{ for i, v := range in { array[i] = v } + default: + v := reflect.ValueOf(args[0]) + if v.Kind() == reflect.Slice || v.Kind() == reflect.Array { + switch v.Type().Elem().Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64, reflect.String, reflect.Bool: + array = make([]any, v.Len()) + for i := 0; i < v.Len(); i++ { + array[i] = v.Index(i).Interface() + } + } + } } var desc bool diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 0d0dec35..f1943925 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -653,6 +653,26 @@ func TestBuiltin_sort_i64(t *testing.T) { assert.Equal(t, []any{int64(1), int64(1), int64(1)}, out) } +func TestBuiltin_sort_non_standard_slice(t *testing.T) { + tests := []struct { + input string + env any + want any + }{ + {`sort(x)`, map[string]any{"x": []int64{3, 1, 2}}, []any{int64(1), int64(2), int64(3)}}, + {`sort(x)`, map[string]any{"x": []uint{3, 1, 2}}, []any{uint(1), uint(2), uint(3)}}, + {`sort(x, "desc")`, map[string]any{"x": []int32{1, 3, 2}}, []any{int32(3), int32(2), int32(1)}}, + } + + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + out, err := expr.Eval(test.input, test.env) + require.NoError(t, err) + assert.Equal(t, test.want, out) + }) + } +} + func TestBuiltin_bitOpsFunc(t *testing.T) { tests := []struct { input string