diff options
author | bep <bjorn.erik.pedersen@gmail.com> | 2015-03-23 19:18:17 +0100 |
---|---|---|
committer | bep <bjorn.erik.pedersen@gmail.com> | 2015-03-23 19:17:55 +0100 |
commit | be84f937169ebcd6b3f6d1d2323fb03feaa416f0 (patch) | |
tree | d3f93001d7cbcfc28b679d762bca7902a98beeb4 /tpl | |
parent | 5b0245ca59e22d90add28b11898ecfd602429e43 (diff) |
Change to variadic int args in Slicestr
Makes for a better template api.
Diffstat (limited to 'tpl')
-rw-r--r-- | tpl/template.go | 21 | ||||
-rw-r--r-- | tpl/template_test.go | 23 |
2 files changed, 23 insertions, 21 deletions
diff --git a/tpl/template.go b/tpl/template.go index 89c522a4f..c94f65725 100644 --- a/tpl/template.go +++ b/tpl/template.go @@ -190,22 +190,23 @@ func compareGetFloat(a interface{}, b interface{}) (float64, float64) { // Slicing in Slicestr is done by specifying a half-open range with // two indices, start and end. 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 Slicestr(a interface{}, start, end int) (string, error) { +// The end index can be omitted, it defaults to the string's length. +func Slicestr(a interface{}, startEnd ...int) (string, error) { aStr, err := cast.ToStringE(a) if err != nil { return "", err } - 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 + if len(startEnd) > 2 { + return "", errors.New("too many arguments") + } + + if len(startEnd) == 2 { + return aStr[startEnd[0]:startEnd[1]], nil + } else if len(startEnd) == 1 { + return aStr[startEnd[0]:], nil } else { - return aStr[start:], nil + return aStr[:], nil } } diff --git a/tpl/template_test.go b/tpl/template_test.go index b3764e737..20a887b1c 100644 --- a/tpl/template_test.go +++ b/tpl/template_test.go @@ -279,20 +279,21 @@ func TestIn(t *testing.T) { func TestSlicestr(t *testing.T) { for i, this := range []struct { v1 interface{} - v2 int - v3 int + v2 []int expect interface{} }{ - {"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}, + {"abc", []int{1, 2}, "b"}, + {"abc", []int{1, 3}, "bc"}, + {"abc", []int{0, 1}, "a"}, + {"abcdef", []int{}, "abcdef"}, + {"abcdef", []int{0, 6}, "abcdef"}, + {"abcdef", []int{0, 2}, "ab"}, + {"abcdef", []int{2}, "cdef"}, + {123, []int{1, 3}, "23"}, + {123, []int{1, 2, 3}, false}, + {tstNoStringer{}, []int{0, 1}, false}, } { - result, err := Slicestr(this.v1, this.v2, this.v3) + result, err := Slicestr(this.v1, this.v2...) if b, ok := this.expect.(bool); ok && !b { if err == nil { |