/
model.go
41 lines (33 loc) · 1.21 KB
/
model.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
package password
// Domain object contains information about characters used to construct a random secret string.
type Domain interface {
Len() uint
AsSlice() []rune
Rune(uint) rune
MergeWith(Domain) Domain
}
type domain struct {
chars []rune
}
// NewDomain create a new domain object.
func NewDomain(chars string) Domain {
return domain{[]rune(chars)}
}
func newDomain(chars []rune) Domain {
return domain{chars}
}
func (d domain) Len() uint { return uint(len(d.chars)) }
func (d domain) AsSlice() []rune { return d.chars }
func (d domain) Rune(idx uint) rune { return d.chars[idx] }
func (d domain) MergeWith(o Domain) Domain { return newDomain(append(d.chars, o.AsSlice()...)) }
// Most common domains
var (
LowerCaseLetters = NewDomain("abcdefghijklmnopqrstuvwxyz")
UpperCaseLetters = NewDomain("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
Numbers = NewDomain("0123456789")
ASCIISpecials = NewDomain(`!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`)
Letters = LowerCaseLetters.MergeWith(UpperCaseLetters)
LettersAndNumbers = Letters.MergeWith(Numbers)
// LettersAndNumbers will be more common than specials
Standard = LettersAndNumbers.MergeWith(LettersAndNumbers).MergeWith(ASCIISpecials)
)