summaryrefslogtreecommitdiffstats
path: root/tpl
diff options
context:
space:
mode:
authorCameron Moore <moorereason@gmail.com>2017-08-18 02:12:04 -0500
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2017-08-18 09:12:04 +0200
commit7674ad73825c61eecc4003475fe0577f225fe579 (patch)
tree6e0affdf18188f16cb443b1dc424eba25dd46e3d /tpl
parent08f48b91d68d3002b887ddf737456ff0cc4e786d (diff)
tpl: Add strings.TrimLeft and TrimRight
Diffstat (limited to 'tpl')
-rw-r--r--tpl/strings/init.go14
-rw-r--r--tpl/strings/strings.go32
-rw-r--r--tpl/strings/strings_test.go70
3 files changed, 116 insertions, 0 deletions
diff --git a/tpl/strings/init.go b/tpl/strings/init.go
index 4f240415a..b7491b81d 100644
--- a/tpl/strings/init.go
+++ b/tpl/strings/init.go
@@ -112,6 +112,20 @@ func init() {
},
)
+ ns.AddMethodMapping(ctx.TrimLeft,
+ nil,
+ [][2]string{
+ {`{{ "aabbaa" | strings.TrimLeft "a" }}`, `bbaa`},
+ },
+ )
+
+ ns.AddMethodMapping(ctx.TrimRight,
+ nil,
+ [][2]string{
+ {`{{ "aabbaa" | strings.TrimRight "a" }}`, `aabb`},
+ },
+ )
+
ns.AddMethodMapping(ctx.Title,
[]string{"title"},
[][2]string{
diff --git a/tpl/strings/strings.go b/tpl/strings/strings.go
index 5fe920433..1e1bda493 100644
--- a/tpl/strings/strings.go
+++ b/tpl/strings/strings.go
@@ -347,6 +347,22 @@ func (ns *Namespace) Trim(s, cutset interface{}) (string, error) {
return _strings.Trim(ss, sc), nil
}
+// TrimLeft returns a slice of the string s with all leading characters
+// contained in cutset removed.
+func (ns *Namespace) TrimLeft(cutset, s interface{}) (string, error) {
+ ss, err := cast.ToStringE(s)
+ if err != nil {
+ return "", err
+ }
+
+ sc, err := cast.ToStringE(cutset)
+ if err != nil {
+ return "", err
+ }
+
+ return _strings.TrimLeft(ss, sc), nil
+}
+
// TrimPrefix returns s without the provided leading prefix string. If s doesn't
// start with prefix, s is returned unchanged.
func (ns *Namespace) TrimPrefix(s, prefix interface{}) (string, error) {
@@ -363,6 +379,22 @@ func (ns *Namespace) TrimPrefix(s, prefix interface{}) (string, error) {
return _strings.TrimPrefix(ss, sx), nil
}
+// TrimRight returns a slice of the string s with all trailing characters
+// contained in cutset removed.
+func (ns *Namespace) TrimRight(cutset, s interface{}) (string, error) {
+ ss, err := cast.ToStringE(s)
+ if err != nil {
+ return "", err
+ }
+
+ sc, err := cast.ToStringE(cutset)
+ if err != nil {
+ return "", err
+ }
+
+ return _strings.TrimRight(ss, sc), nil
+}
+
// TrimSuffix returns s without the provided trailing suffix string. If s
// doesn't end with suffix, s is returned unchanged.
func (ns *Namespace) TrimSuffix(s, suffix interface{}) (string, error) {
diff --git a/tpl/strings/strings_test.go b/tpl/strings/strings_test.go
index 64ec0864f..8c6b97602 100644
--- a/tpl/strings/strings_test.go
+++ b/tpl/strings/strings_test.go
@@ -574,6 +574,41 @@ func TestTrim(t *testing.T) {
}
}
+func TestTrimLeft(t *testing.T) {
+ t.Parallel()
+
+ for i, test := range []struct {
+ s interface{}
+ cutset interface{}
+ expect interface{}
+ }{
+ {"abba", "a", "bba"},
+ {"abba", "ab", ""},
+ {"<tag>", "<>", "tag>"},
+ {`"quote"`, `"`, `quote"`},
+ {1221, "1", "221"},
+ {1221, "12", ""},
+ {"007", "0", "7"},
+ {template.HTML("<tag>"), "<>", "tag>"},
+ {[]byte("<tag>"), "<>", "tag>"},
+ // errors
+ {"", tstNoStringer{}, false},
+ {tstNoStringer{}, "", false},
+ } {
+ errMsg := fmt.Sprintf("[%d] %v", i, test)
+
+ result, err := ns.TrimLeft(test.cutset, test.s)
+
+ if b, ok := test.expect.(bool); ok && !b {
+ require.Error(t, err, errMsg)
+ continue
+ }
+
+ require.NoError(t, err, errMsg)
+ assert.Equal(t, test.expect, result, errMsg)
+ }
+}
+
func TestTrimPrefix(t *testing.T) {
t.Parallel()
@@ -604,6 +639,41 @@ func TestTrimPrefix(t *testing.T) {
}
}
+func TestTrimRight(t *testing.T) {
+ t.Parallel()
+
+ for i, test := range []struct {
+ s interface{}
+ cutset interface{}
+ expect interface{}
+ }{
+ {"abba", "a", "abb"},
+ {"abba", "ab", ""},
+ {"<tag>", "<>", "<tag"},
+ {`"quote"`, `"`, `"quote`},
+ {1221, "1", "122"},
+ {1221, "12", ""},
+ {"007", "0", "007"},
+ {template.HTML("<tag>"), "<>", "<tag"},
+ {[]byte("<tag>"), "<>", "<tag"},
+ // errors
+ {"", tstNoStringer{}, false},
+ {tstNoStringer{}, "", false},
+ } {
+ errMsg := fmt.Sprintf("[%d] %v", i, test)
+
+ result, err := ns.TrimRight(test.cutset, test.s)
+
+ if b, ok := test.expect.(bool); ok && !b {
+ require.Error(t, err, errMsg)
+ continue
+ }
+
+ require.NoError(t, err, errMsg)
+ assert.Equal(t, test.expect, result, errMsg)
+ }
+}
+
func TestTrimSuffix(t *testing.T) {
t.Parallel()