This commit is contained in:
Olivia Bahr 2024-09-20 10:25:21 +08:00 committed by GitHub
commit c2b0940eac
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 89 additions and 0 deletions

View file

@ -17,6 +17,7 @@ func funcMap() template.FuncMap {
"replaceP": replaceP,
"gt": gt,
"lt": lt,
"random": random,
"reason": GetReasonFromStatus,
"hresult": hresult,
"trunc": trunc,

22
src/template/random.go Normal file
View file

@ -0,0 +1,22 @@
package template
import (
"errors"
"fmt"
"math/rand"
"reflect"
)
func random(list interface{}) (string, error) {
v := reflect.ValueOf(list)
if v.Kind() != reflect.Slice && v.Kind() != reflect.Array {
return "", errors.New("input must be a slice or array")
}
if v.Len() == 0 {
return "", errors.New("input slice or array is empty")
}
return fmt.Sprintf("%v", v.Index(rand.Intn(v.Len()))), nil
}

View file

@ -0,0 +1,65 @@
package template
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
)
func TestRandom(t *testing.T) {
cases := []struct {
Case string
Input interface{}
ShouldError bool
}{
{
Case: "valid slice",
Input: []int{1, 2, 3, 4, 5},
},
{
Case: "valid array",
Input: [5]int{1, 2, 3, 4, 5},
},
{
Case: "empty slice",
Input: []int{},
ShouldError: true,
},
{
Case: "not a slice or array",
Input: "not a slice",
ShouldError: true,
},
{
Case: "valid string slice",
Input: []string{"a", "b", "c"},
},
{
Case: "valid float slice",
Input: []float64{1.1, 2.2, 3.3},
},
{
Case: "interface with multiple types",
Input: []interface{}{
"a",
1,
true,
},
},
{
Case: "valid struct slice",
Input: []struct{ Name string }{{Name: "Alice"}, {Name: "Bob"}},
},
}
for _, tc := range cases {
result, err := random(tc.Input)
if tc.ShouldError {
assert.Error(t, err, tc.Case)
} else {
assert.NoError(t, err, tc.Case)
assert.Contains(t, fmt.Sprintf("%v", tc.Input), result, tc.Case)
}
}
}

View file

@ -182,6 +182,7 @@ use them.
| `{{ replaceP "c.t" "cut code cat" "dog" }}` | Exposes [regexp.ReplaceAllString][regexpra] as a string template function. |
| <code>\{\{ .Code &vert; hresult \}\}</code> | Transform a status code to its HRESULT value for easy troubleshooting. For example `-1978335212` becomes `0x8A150014`. |
| `{{ readFile ".version.json" }}` | Read a file in the current directory. Returns a string. |
| `{{ random (list \"a\" 2 .MyThirdItem) }}` | Selects a random element from a list. The list can be an array or slice containing any types (use sprig's `list`). |
<!-- markdownlint-enable MD013 -->