diff options
| -rw-r--r-- | docs/content/functions/strings.md | 29 | ||||
| -rw-r--r-- | funcs/strings.go | 18 | ||||
| -rw-r--r-- | funcs/strings_test.go | 12 | ||||
| -rw-r--r-- | strings/strings.go | 12 | ||||
| -rw-r--r-- | strings/strings_test.go | 14 |
5 files changed, 84 insertions, 1 deletions
diff --git a/docs/content/functions/strings.md b/docs/content/functions/strings.md index 85442d42..e56fd68f 100644 --- a/docs/content/functions/strings.md +++ b/docs/content/functions/strings.md @@ -153,6 +153,35 @@ foo: quuz: 42 ``` +## `strings.Sort` + +**Alias:** `sort` + +Returns an alphanumerically-sorted copy of a given string list. + + +### Usage +```go +strings.Sort list +``` + +```go +list | strings.Sort +``` + +### Arguments + +| name | description | +|------|-------------| +| `list` | _(required)_ The list to sort | + +### Examples + +```console +$ gomplate -i '{{ (slice "foo" "bar" "baz") | sort }}' +[bar baz foo] +``` + ## `strings.Split` Creates a slice by splitting a string on a given delimiter. diff --git a/funcs/strings.go b/funcs/strings.go index d14223d6..93b0bd9b 100644 --- a/funcs/strings.go +++ b/funcs/strings.go @@ -40,6 +40,7 @@ func AddStringFuncs(f map[string]interface{}) { f["toLower"] = StrNS().ToLower f["trimSpace"] = StrNS().TrimSpace f["indent"] = StrNS().Indent + f["sort"] = StrNS().Sort // these are legacy aliases with non-pipelinable arg order f["contains"] = strings.Contains @@ -108,6 +109,23 @@ func (f *StringFuncs) Repeat(count int, s interface{}) (string, error) { return strings.Repeat(str, count), nil } +// Sort - +func (f *StringFuncs) Sort(list interface{}) ([]string, error) { + switch v := list.(type) { + case []string: + return gompstrings.Sort(v), nil + case []interface{}: + l := len(v) + b := make([]string, len(v)) + for i := 0; i < l; i++ { + b[i] = conv.ToString(v[i]) + } + return gompstrings.Sort(b), nil + default: + return nil, errors.Errorf("wrong type for value; expected []string; got %T", list) + } +} + // Split - func (f *StringFuncs) Split(sep string, s interface{}) []string { return strings.Split(conv.ToString(s), sep) diff --git a/funcs/strings_test.go b/funcs/strings_test.go index e074fe8c..38ddfacc 100644 --- a/funcs/strings_test.go +++ b/funcs/strings_test.go @@ -85,3 +85,15 @@ func TestSlug(t *testing.T) { s = sf.Slug(`100%`) assert.Equal(t, "100", s) } + +func must(in interface{}, err error) interface{} { + return in +} +func TestSort(t *testing.T) { + sf := &StringFuncs{} + in := []string{"foo", "bar", "baz"} + out := []string{"bar", "baz", "foo"} + assert.Equal(t, out, must(sf.Sort(in))) + + assert.Equal(t, out, must(sf.Sort([]interface{}{"foo", "bar", "baz"}))) +} diff --git a/strings/strings.go b/strings/strings.go index 3b90c83e..6d89def7 100644 --- a/strings/strings.go +++ b/strings/strings.go @@ -1,6 +1,9 @@ package strings -import "strings" +import ( + "sort" + "strings" +) // Indent - indent each line of the string with the given indent string func Indent(width int, indent, s string) string { @@ -33,3 +36,10 @@ func Trunc(length int, s string) string { } return s[0:length] } + +// Sort - return an alphanumerically-sorted list of strings +func Sort(list []string) []string { + sorted := sort.StringSlice(list) + sorted.Sort() + return sorted +} diff --git a/strings/strings_test.go b/strings/strings_test.go index ad32e3f6..f2afb2f5 100644 --- a/strings/strings_test.go +++ b/strings/strings_test.go @@ -25,3 +25,17 @@ func TestTrunc(t *testing.T) { assert.Equal(t, "hello, world", Trunc(42, "hello, world")) assert.Equal(t, "hello, world", Trunc(-1, "hello, world")) } + +func TestSort(t *testing.T) { + in := []string{} + expected := []string{} + assert.EqualValues(t, expected, Sort(in)) + + in = []string{"c", "a", "b"} + expected = []string{"a", "b", "c"} + assert.EqualValues(t, expected, Sort(in)) + + in = []string{"42", "45", "18"} + expected = []string{"18", "42", "45"} + assert.EqualValues(t, expected, Sort(in)) +} |
