From a2df3f114acbeaabc69b6b854c22dd21ead581b8 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 16 May 2018 16:28:01 +0200 Subject: inital import --- main.go | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 main.go (limited to 'main.go') 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) +} -- cgit v1.2.3