6
6
"math/rand"
7
7
"strings"
8
8
"time"
9
- "unicode/utf8"
10
9
)
11
10
12
11
// A Haikunator represents all options needed to use haikunate()
@@ -53,6 +52,11 @@ var nouns = []string{
53
52
"wood" ,
54
53
}
55
54
55
+ const (
56
+ numbers = "0123456789"
57
+ hex = "0123456789abcdef"
58
+ )
59
+
56
60
// NewHaikunator creates a new Haikunator with all default options
57
61
func NewHaikunator () Haikunator {
58
62
return Haikunator {
@@ -61,49 +65,58 @@ func NewHaikunator() Haikunator {
61
65
Delimiter : "-" ,
62
66
TokenLength : 4 ,
63
67
TokenHex : false ,
64
- TokenChars : "0123456789" ,
68
+ TokenChars : numbers ,
65
69
Random : rand .New (rand .NewSource (time .Now ().UnixNano ())),
66
70
}
67
71
}
68
72
69
73
// Haikunate generates a random Heroku-like string
70
74
func (h * Haikunator ) Haikunate () string {
71
- if h .TokenHex {
72
- h .TokenChars = "0123456789abcdef"
73
- }
74
-
75
75
adjective := h .randomString (h .Adjectives )
76
76
noun := h .randomString (h .Nouns )
77
+ token := h .buildToken ()
77
78
78
- var token string
79
+ sections := deleteEmpty ([]string {adjective , noun , token })
80
+ return strings .Join (sections , h .Delimiter )
81
+ }
79
82
80
- if len ( h . TokenChars ) > 0 {
81
- var buffer bytes. Buffer
83
+ func ( h * Haikunator ) buildToken () string {
84
+ var chars [] rune
82
85
83
- for i := 0 ; i < h .TokenLength ; i ++ {
84
- randomIndex := h .Random .Intn (utf8 .RuneCountInString (h .TokenChars ))
85
- buffer .WriteRune ([]rune (h .TokenChars )[randomIndex ])
86
- }
86
+ if h .TokenHex {
87
+ chars = []rune (hex )
88
+ } else {
89
+ chars = []rune (h .TokenChars )
90
+ }
91
+
92
+ size := len (chars )
87
93
88
- token = buffer .String ()
94
+ if size <= 0 {
95
+ return ""
89
96
}
90
97
91
- sections := deleteEmpty ([]string {adjective , noun , token })
92
- return strings .Join (sections , h .Delimiter )
98
+ var buffer bytes.Buffer
99
+
100
+ for i := 0 ; i < h .TokenLength ; i ++ {
101
+ index := h .Random .Intn (size )
102
+ buffer .WriteRune (chars [index ])
103
+ }
104
+
105
+ return buffer .String ()
93
106
}
94
107
95
- // Get random string from string array
108
+ // Get random string from slice
96
109
func (h * Haikunator ) randomString (s []string ) string {
97
110
size := len (s )
98
111
99
- if size <= 0 { // Random.Intn panics otherwise
112
+ if size <= 0 {
100
113
return ""
101
114
}
102
115
103
116
return s [h .Random .Intn (size )]
104
117
}
105
118
106
- // Deletes empty strings from string array
119
+ // Deletes empty strings from slice
107
120
func deleteEmpty (s []string ) []string {
108
121
var r []string
109
122
for _ , str := range s {
0 commit comments