summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/content/functions/strings.md29
-rw-r--r--funcs/strings.go18
-rw-r--r--funcs/strings_test.go12
-rw-r--r--strings/strings.go12
-rw-r--r--strings/strings_test.go14
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))
+}