From 90d0cdf236b54000bfe444ba3a00236faaa28790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 11 Nov 2019 18:14:45 +0100 Subject: [PATCH] tpl/collections: Add collections.Reverse Fixes #6499 --- tpl/collections/collections.go | 23 +++++++++++++++++++++++ tpl/collections/collections_test.go | 19 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/tpl/collections/collections.go b/tpl/collections/collections.go index df8aaa6c7..0f0fd7ffb 100644 --- a/tpl/collections/collections.go +++ b/tpl/collections/collections.go @@ -417,6 +417,29 @@ func (ns *Namespace) Querify(params ...interface{}) (string, error) { return qs.Encode(), nil } +// Reverse creates a copy of slice and reverses it. +func (ns *Namespace) Reverse(slice interface{}) (interface{}, error) { + if slice == nil { + return nil, nil + } + v := reflect.ValueOf(slice) + + switch v.Kind() { + case reflect.Slice: + default: + return nil, errors.New("argument must be a slice") + } + + sliceCopy := reflect.MakeSlice(v.Type(), v.Len(), v.Len()) + + for i := v.Len() - 1; i >= 0; i-- { + element := sliceCopy.Index(i) + element.Set(v.Index(v.Len() - 1 - i)) + } + + return sliceCopy.Interface(), nil +} + // Seq creates a sequence of integers. It's named and used as GNU's seq. // // Examples: diff --git a/tpl/collections/collections_test.go b/tpl/collections/collections_test.go index 8946da805..3830a7505 100644 --- a/tpl/collections/collections_test.go +++ b/tpl/collections/collections_test.go @@ -211,6 +211,25 @@ func TestDictionary(t *testing.T) { } } +func TestReverse(t *testing.T) { + t.Parallel() + c := qt.New(t) + ns := New(&deps.Deps{}) + + s := []string{"a", "b", "c"} + reversed, err := ns.Reverse(s) + c.Assert(err, qt.IsNil) + c.Assert(reversed, qt.DeepEquals, []string{"c", "b", "a"}, qt.Commentf(fmt.Sprint(reversed))) + c.Assert(s, qt.DeepEquals, []string{"a", "b", "c"}) + + reversed, err = ns.Reverse(nil) + c.Assert(err, qt.IsNil) + c.Assert(reversed, qt.IsNil) + _, err = ns.Reverse(43) + c.Assert(err, qt.Not(qt.IsNil)) + +} + func TestEchoParam(t *testing.T) { t.Parallel() c := qt.New(t)