diff --git a/ucl/builtins/strs.go b/ucl/builtins/strs.go index fb6a3d3..03801d0 100644 --- a/ucl/builtins/strs.go +++ b/ucl/builtins/strs.go @@ -77,7 +77,7 @@ func split(ctx context.Context, args ucl.CallArgs) (any, error) { } } - return StringSlice(strings.SplitN(s, sep, n)), nil + return ucl.StringListObject(strings.SplitN(s, sep, n)), nil } func join(ctx context.Context, args ucl.CallArgs) (any, error) { @@ -128,5 +128,3 @@ func join(ctx context.Context, args ucl.CallArgs) (any, error) { return nil, errors.New("expected listable or iterable as arg 1") } - -type StringSlice []string diff --git a/ucl/builtins/strs_test.go b/ucl/builtins/strs_test.go index 6af7082..9545e0c 100644 --- a/ucl/builtins/strs_test.go +++ b/ucl/builtins/strs_test.go @@ -140,17 +140,17 @@ func TestStrs_Split(t *testing.T) { want any wantErr bool }{ - {desc: "split 1", eval: `strs:split "1,2,3" ","`, want: builtins.StringSlice{"1", "2", "3"}}, - {desc: "split 2", eval: `strs:split "1,2,3" ";"`, want: builtins.StringSlice{"1,2,3"}}, - {desc: "split 3", eval: `strs:split "" ";"`, want: builtins.StringSlice{""}}, - {desc: "split 4", eval: `strs:split " " ";"`, want: builtins.StringSlice{" "}}, + {desc: "split 1", eval: `strs:split "1,2,3" ","`, want: ucl.StringListObject{"1", "2", "3"}}, + {desc: "split 2", eval: `strs:split "1,2,3" ";"`, want: ucl.StringListObject{"1,2,3"}}, + {desc: "split 3", eval: `strs:split "" ";"`, want: ucl.StringListObject{""}}, + {desc: "split 4", eval: `strs:split " " ";"`, want: ucl.StringListObject{" "}}, - {desc: "split by char 1", eval: `strs:split "123"`, want: builtins.StringSlice{"1", "2", "3"}}, + {desc: "split by char 1", eval: `strs:split "123"`, want: ucl.StringListObject{"1", "2", "3"}}, - {desc: "split max 1", eval: `strs:split "1,2,3" "," -max 2`, want: builtins.StringSlice{"1", "2,3"}}, - {desc: "split max 2", eval: `strs:split "1,2,3" "," -max 5`, want: builtins.StringSlice{"1", "2", "3"}}, + {desc: "split max 1", eval: `strs:split "1,2,3" "," -max 2`, want: ucl.StringListObject{"1", "2,3"}}, + {desc: "split max 2", eval: `strs:split "1,2,3" "," -max 5`, want: ucl.StringListObject{"1", "2", "3"}}, - {desc: "split by char max 1", eval: `strs:split "12345" -max 3`, want: builtins.StringSlice{"1", "2", "345"}}, + {desc: "split by char max 1", eval: `strs:split "12345" -max 3`, want: ucl.StringListObject{"1", "2", "345"}}, {desc: "err 1", eval: `strs:split "1,2,3" -max []`, wantErr: true}, } diff --git a/ucl/objs.go b/ucl/objs.go index c17e246..2ea3cac 100644 --- a/ucl/objs.go +++ b/ucl/objs.go @@ -80,6 +80,24 @@ func (s *ListObject) Index(i int) Object { return (*s)[i] } +type StringListObject []string + +func (ss StringListObject) String() string { + return fmt.Sprintf("[%v]", strings.Join(ss, " ")) +} + +func (ss StringListObject) Truthy() bool { + return len(ss) > 0 +} + +func (ss StringListObject) Len() int { + return len(ss) +} + +func (ss StringListObject) Index(i int) Object { + return StringObject(ss[i]) +} + type iteratorObject struct { Iterable } @@ -185,6 +203,8 @@ func toGoValue(obj Object) (interface{}, bool) { return string(v), true case IntObject: return int(v), true + case StringListObject: + return []string(v), true case boolObject: return bool(v), true case timeObject: