diff options
author | Cameron Moore <moorereason@gmail.com> | 2017-08-18 02:12:04 -0500 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2017-08-18 09:12:04 +0200 |
commit | 7674ad73825c61eecc4003475fe0577f225fe579 (patch) | |
tree | 6e0affdf18188f16cb443b1dc424eba25dd46e3d /tpl/strings | |
parent | 08f48b91d68d3002b887ddf737456ff0cc4e786d (diff) |
tpl: Add strings.TrimLeft and TrimRight
Diffstat (limited to 'tpl/strings')
-rw-r--r-- | tpl/strings/init.go | 14 | ||||
-rw-r--r-- | tpl/strings/strings.go | 32 | ||||
-rw-r--r-- | tpl/strings/strings_test.go | 70 |
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() |