From 7674ad73825c61eecc4003475fe0577f225fe579 Mon Sep 17 00:00:00 2001 From: Cameron Moore Date: Fri, 18 Aug 2017 02:12:04 -0500 Subject: [PATCH] tpl: Add strings.TrimLeft and TrimRight --- tpl/strings/init.go | 14 ++++++++ tpl/strings/strings.go | 32 +++++++++++++++++ tpl/strings/strings_test.go | 70 +++++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+) 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>"}, + {`"quote"`, `"`, `quote"`}, + {1221, "1", "221"}, + {1221, "12", ""}, + {"007", "0", "7"}, + {template.HTML(""), "<>", "tag>"}, + {[]byte(""), "<>", "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", ""}, + {"", "<>", ""), "<>", ""), "<>", "