✨ Add MultiGeneratorRandomOrder
This commit is contained in:
parent
2440f55563
commit
7c016df30f
3 changed files with 101 additions and 23 deletions
|
|
@ -1,6 +1,9 @@
|
||||||
package nomino
|
package nomino
|
||||||
|
|
||||||
import "errors"
|
import (
|
||||||
|
"errors"
|
||||||
|
"math/rand"
|
||||||
|
)
|
||||||
|
|
||||||
// Generator is a function that returns the "random" portion of the returned filename.
|
// Generator is a function that returns the "random" portion of the returned filename.
|
||||||
// Technically, it doesn't necessarily need to be random, and could be based on time, or a counter,
|
// Technically, it doesn't necessarily need to be random, and could be based on time, or a counter,
|
||||||
|
|
@ -45,3 +48,20 @@ func MultiGeneratorInOrder(gens ...Generator) Generator {
|
||||||
return st, err
|
return st, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MultiGeneratorRandomOrder allows the use of multiple generators. Each new invokation will use one of the generators randomly.
|
||||||
|
// If none are passed, the generator will always return ErrMissingGenerators.
|
||||||
|
func MultiGeneratorRandomOrder(gens ...Generator) Generator {
|
||||||
|
if len(gens) == 0 {
|
||||||
|
return missingGen
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(gens) == 1 {
|
||||||
|
return gens[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
return func(c *Config) (string, error) {
|
||||||
|
idx := rand.Int() % len(gens)
|
||||||
|
return gens[idx](c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,18 +7,14 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func ExampleWithGenerator_customGenerator() {
|
func ExampleWithGenerator_customGenerator() {
|
||||||
gen := func(*nomino.Config) (string, error) {
|
var gen nomino.Generator = func(*nomino.Config) (string, error) {
|
||||||
return "hello", nil
|
return "hello", nil
|
||||||
}
|
}
|
||||||
option := nomino.WithGenerator(gen)
|
|
||||||
|
|
||||||
str, _ := nomino.Make(nomino.NewConfig(option))
|
str, _ := gen.Make()
|
||||||
fmt.Println(str)
|
fmt.Println(str)
|
||||||
|
|
||||||
str, _ = nomino.Make(nomino.NewConfig(
|
str, _ = gen.Make(nomino.WithoutExtension())
|
||||||
option,
|
|
||||||
nomino.WithoutExtension(),
|
|
||||||
))
|
|
||||||
fmt.Println(str)
|
fmt.Println(str)
|
||||||
|
|
||||||
// Output:
|
// Output:
|
||||||
|
|
@ -47,15 +43,14 @@ func ExampleMultiGeneratorInOrder() {
|
||||||
return "goodbye", nil
|
return "goodbye", nil
|
||||||
}
|
}
|
||||||
gen := nomino.MultiGeneratorInOrder(gen1, gen2)
|
gen := nomino.MultiGeneratorInOrder(gen1, gen2)
|
||||||
option := nomino.WithGenerator(gen)
|
|
||||||
|
|
||||||
str, _ := nomino.Make(nomino.NewConfig(option))
|
str, _ := gen.Make()
|
||||||
fmt.Println(str)
|
fmt.Println(str)
|
||||||
|
|
||||||
str, _ = nomino.Make(nomino.NewConfig(option))
|
str, _ = gen.Make()
|
||||||
fmt.Println(str)
|
fmt.Println(str)
|
||||||
|
|
||||||
str, _ = nomino.Make(nomino.NewConfig(option))
|
str, _ = gen.Make()
|
||||||
fmt.Println(str)
|
fmt.Println(str)
|
||||||
|
|
||||||
// Output:
|
// Output:
|
||||||
|
|
@ -63,3 +58,22 @@ func ExampleMultiGeneratorInOrder() {
|
||||||
// goodbye.txt
|
// goodbye.txt
|
||||||
// hello.txt
|
// hello.txt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExampleMultiGeneratorRandomOrder() {
|
||||||
|
gen1 := func(*nomino.Config) (string, error) {
|
||||||
|
return "hello", nil
|
||||||
|
}
|
||||||
|
gen2 := func(*nomino.Config) (string, error) {
|
||||||
|
return "goodbye", nil
|
||||||
|
}
|
||||||
|
gen := nomino.MultiGeneratorRandomOrder(gen1, gen2)
|
||||||
|
|
||||||
|
str, _ := gen.Make()
|
||||||
|
fmt.Println(str)
|
||||||
|
|
||||||
|
str, _ = gen.Make()
|
||||||
|
fmt.Println(str)
|
||||||
|
|
||||||
|
str, _ = gen.Make()
|
||||||
|
fmt.Println(str)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,26 +16,34 @@ func TestWithGenerator(t *testing.T) {
|
||||||
assert.Equal(t, "abc", st)
|
assert.Equal(t, "abc", st)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
out1 string = "abc"
|
||||||
|
out2 string = "def"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
outs = []string{out1, out2}
|
||||||
|
err1 = errors.New("oops")
|
||||||
|
gen1 Generator = func(*Config) (string, error) { return out1, nil }
|
||||||
|
gen2 Generator = func(*Config) (string, error) { return out2, nil }
|
||||||
|
gen3 Generator = func(*Config) (string, error) { return "", err1 }
|
||||||
|
gens = []Generator{gen1, gen2, gen3}
|
||||||
|
)
|
||||||
|
|
||||||
func TestMultiGeneratorInOrder(t *testing.T) {
|
func TestMultiGeneratorInOrder(t *testing.T) {
|
||||||
st1 := "abc"
|
g := MultiGeneratorInOrder(gens...)
|
||||||
st2 := "def"
|
|
||||||
er1 := errors.New("oops")
|
|
||||||
g1 := func(*Config) (string, error) { return st1, nil }
|
|
||||||
g2 := func(*Config) (string, error) { return st2, nil }
|
|
||||||
g3 := func(*Config) (string, error) { return "", er1 }
|
|
||||||
g := MultiGeneratorInOrder(g1, g2, g3)
|
|
||||||
st, err := g(nil)
|
st, err := g(nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, st1, st)
|
assert.Equal(t, out1, st)
|
||||||
st, err = g(nil)
|
st, err = g(nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, st2, st)
|
assert.Equal(t, out2, st)
|
||||||
st, err = g(nil)
|
st, err = g(nil)
|
||||||
assert.Zero(t, st)
|
assert.Zero(t, st)
|
||||||
assert.ErrorIs(t, err, er1)
|
assert.ErrorIs(t, err, err1)
|
||||||
st, err = g(nil)
|
st, err = g(nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, st1, st)
|
assert.Equal(t, out1, st)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMultiGeneratorInOrderOne(t *testing.T) {
|
func TestMultiGeneratorInOrderOne(t *testing.T) {
|
||||||
|
|
@ -60,3 +68,39 @@ func TestMultiGeneratorInOrderMissing(t *testing.T) {
|
||||||
assert.Zero(t, st)
|
assert.Zero(t, st)
|
||||||
assert.ErrorIs(t, err, ErrMissingGenerators)
|
assert.ErrorIs(t, err, ErrMissingGenerators)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMultiGeneratorRandomOrder(t *testing.T) {
|
||||||
|
g := MultiGeneratorRandomOrder(gens...)
|
||||||
|
for i := 0; i < 4; i++ {
|
||||||
|
st, err := g(nil)
|
||||||
|
if err != nil {
|
||||||
|
assert.Zero(t, st)
|
||||||
|
assert.ErrorIs(t, err, err1)
|
||||||
|
} else {
|
||||||
|
assert.Contains(t, outs, st)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMultiGeneratorRandomOrderOne(t *testing.T) {
|
||||||
|
st1 := "abc"
|
||||||
|
g1 := func(*Config) (string, error) { return st1, nil }
|
||||||
|
g := MultiGeneratorRandomOrder(g1)
|
||||||
|
|
||||||
|
st, err := g(nil)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, st1, st)
|
||||||
|
st, err = g(nil)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, st1, st)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMultiGeneratorRandomOrderMissing(t *testing.T) {
|
||||||
|
g := MultiGeneratorRandomOrder()
|
||||||
|
st, err := g(nil)
|
||||||
|
assert.Zero(t, st)
|
||||||
|
assert.ErrorIs(t, err, ErrMissingGenerators)
|
||||||
|
st, err = g(nil)
|
||||||
|
assert.Zero(t, st)
|
||||||
|
assert.ErrorIs(t, err, ErrMissingGenerators)
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue