-
Notifications
You must be signed in to change notification settings - Fork 0
/
generator.go
70 lines (54 loc) · 1.41 KB
/
generator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package uniquenamegenerator
import (
"math/rand"
"strings"
"time"
"github.com/dillonstreator/go-unique-name-generator/dictionaries"
)
// UniqueNameGenerator is a unique name generator instance
type UniqueNameGenerator struct {
separator string
dictionaries [][]string
transformer Transformer
rnd *rand.Rand
}
// NewUniqueNameGenerator creates a new instance of UniqueNameGenerator
func NewUniqueNameGenerator(opts ...option) *UniqueNameGenerator {
ung := &UniqueNameGenerator{
separator: "_",
dictionaries: [][]string{
dictionaries.Adjectives,
dictionaries.Colors,
dictionaries.Names,
},
rnd: rand.New(rand.NewSource(time.Now().UTC().UnixNano())),
}
for _, opt := range opts {
opt(ung)
}
return ung
}
// Generate generates a new unique name with the configuration
func (ung *UniqueNameGenerator) Generate() string {
words := make([]string, len(ung.dictionaries))
for i, dict := range ung.dictionaries {
randomIndex := ung.rnd.Intn(len(dict))
word := dict[randomIndex]
if ung.transformer != nil {
word = ung.transformer(dict[randomIndex])
}
words[i] = word
}
return strings.Join(words, ung.separator)
}
// UniquenessCount returns the number of unique combinations
func (ung *UniqueNameGenerator) UniquenessCount() uint64 {
if len(ung.dictionaries) == 0 {
return 0
}
var count uint64 = 1
for _, set := range ung.dictionaries {
count *= uint64(len(set))
}
return count
}