return left, right
}
-func Substr(a interface{}, pos, length int) (string, error) {
+// Slicing in Slice is done by specifying a half-open range with
+// two indices, lower and upper. 1 and 4 creates a slice including elements 1 through 3.
+// The start and/or end indices can be omitted by setting one or both of them to -1; they default to zero and the slice's length respectively
+func Slice(a interface{}, start, end int) (string, error) {
aStr, err := cast.ToStringE(a)
if err != nil {
return "", err
}
- return aStr[pos:length], nil
+
+ if start != -1 && end != -1 {
+ return aStr[start:end], nil
+ } else if start == -1 && end == -1 {
+ return aStr[:], nil
+ } else if start == -1 {
+ return aStr[:end], nil
+ } else {
+ return aStr[start:], nil
+ }
+
}
func Split(a interface{}, delimiter string) ([]string, error) {
"lt": Lt,
"le": Le,
"in": In,
- "substr": Substr,
+ "slice": Slice,
"split": Split,
"intersect": Intersect,
"isSet": IsSet,
}
}
-func TestSubstr(t *testing.T) {
+func TestSlice(t *testing.T) {
for i, this := range []struct {
v1 interface{}
v2 int
{"abc", 1, 2, "b"},
{"abc", 1, 3, "bc"},
{"abc", 0, 1, "a"},
+ {"abcdef", -1, -1, "abcdef"},
+ {"abcdef", -1, 2, "ab"},
+ {"abcdef", 2, -1, "cdef"},
{123, 1, 3, "23"},
{tstNoStringer{}, 0, 1, false},
} {
- result, err := Substr(this.v1, this.v2, this.v3)
+ result, err := Slice(this.v1, this.v2, this.v3)
if b, ok := this.expect.(bool); ok && !b {
if err == nil {
- t.Errorf("[%d] Substr didn't return an expected error", i)
+ t.Errorf("[%d] Slice didn't return an expected error", i)
}
} else {
if err != nil {