summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2018-05-16 16:28:01 +0200
committerDimitri Sokolyuk <demon@dim13.org>2018-05-16 16:28:01 +0200
commita2df3f114acbeaabc69b6b854c22dd21ead581b8 (patch)
tree990d5f6e174a6c7cb3f9eaba34ebbb63eef7c9ba /main.go
inital import
Diffstat (limited to 'main.go')
-rw-r--r--main.go76
1 files changed, 76 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..a957ea3
--- /dev/null
+++ b/main.go
@@ -0,0 +1,76 @@
+package main
+
+import (
+ "bufio"
+ "flag"
+ "fmt"
+ "log"
+ "math/rand"
+ "os"
+ "strconv"
+ "strings"
+)
+
+type random interface {
+ Intn(n int) int
+}
+
+type generator struct {
+ minWords int
+ minLength int
+ separator string
+ titleWords bool
+ addNumber bool
+ dict []string
+}
+
+func (g *generator) loadWords(fname string) error {
+ fd, err := os.Open(fname)
+ if err != nil {
+ return err
+ }
+ defer fd.Close()
+ scanner := bufio.NewScanner(fd)
+ for scanner.Scan() {
+ g.dict = append(g.dict, scanner.Text())
+ }
+ return scanner.Err()
+}
+
+func (g generator) pick(rnd random) string {
+ word := g.dict[rnd.Intn(len(g.dict))]
+ if g.titleWords {
+ return strings.Title(word)
+ }
+ return word
+}
+
+func (g generator) generate(rnd random) string {
+ var v []string
+ for i := 0; i < g.minWords; i++ {
+ v = append(v, g.pick(rnd))
+ }
+ if g.addNumber {
+ v = append(v, strconv.Itoa(rnd.Intn(10)))
+ }
+ pw := strings.Join(v, g.separator)
+ if len(pw) < g.minLength {
+ return g.generate(rnd)
+ }
+ return pw
+}
+
+func main() {
+ var g generator
+ flag.IntVar(&g.minWords, "words", 6, "min words")
+ flag.IntVar(&g.minLength, "length", 30, "min lenght")
+ flag.StringVar(&g.separator, "separator", "-", "word separator")
+ flag.BoolVar(&g.titleWords, "title", false, "make first letter uppercase")
+ flag.BoolVar(&g.addNumber, "number", false, "append random number to the end (0 - 9)")
+ flag.Parse()
+ if err := g.loadWords("data/wordlist.txt"); err != nil {
+ log.Fatal(err)
+ }
+ pw := g.generate(rand.New(cryptoSource{}))
+ fmt.Println(pw)
+}