1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: AGPL-3.0-or-later
4
5package main
6
7import (
8 "fmt"
9 "math/rand"
10 "os"
11 "strconv"
12 "strings"
13 "time"
14)
15
16var (
17 length = 20
18 version = ""
19)
20
21func main() {
22 if len(os.Args) > 1 && os.Args[1] == "-h" {
23 printHelp()
24 os.Exit(0)
25 } else if len(os.Args) > 3 {
26 fmt.Print("Error: too many arguments...\n\n")
27 printHelp()
28 os.Exit(1)
29 } else if len(os.Args) == 2 {
30 // Convert the string argument to an int
31 length, err := strconv.Atoi(os.Args[1])
32 if err != nil {
33 fmt.Println("Error: length must be an integer")
34 os.Exit(1)
35 }
36 fmt.Println(generate(length))
37 os.Exit(0)
38 } else if len(os.Args) == 3 {
39 length, err := strconv.Atoi(os.Args[1])
40 if err != nil {
41 fmt.Println("Error: length must be an integer")
42 os.Exit(1)
43 }
44 count, err := strconv.Atoi(os.Args[2])
45 if err != nil {
46 fmt.Println("Error: count must be an integer")
47 os.Exit(1)
48 }
49 for i := 0; i < count; i++ {
50 fmt.Println(generate(length))
51 }
52 os.Exit(0)
53 } else if len(os.Args) == 1 {
54 fmt.Println(generate(length))
55 os.Exit(0)
56 }
57}
58
59func generate(length int) string {
60 const newBase60Chars = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ_abcdefghijkmnopqrstuvwxyz"
61
62 rng := rand.New(rand.NewSource(time.Now().UnixNano()))
63
64 var sb strings.Builder
65 sb.Grow(length)
66
67 for i := 0; i < length; i++ {
68 sb.WriteByte(newBase60Chars[rng.Intn(len(newBase60Chars))])
69 }
70
71 return sb.String()
72}
73
74func printHelp() {
75 fmt.Println(`Usage: eow [-h] <length> <count>
76
77-h prints this help message
78
79Arguments are positional, so length AND count
80may be omitted OR count may be omitted. If
81specifying count, length must also be
82specified. When ommitted, length defaults to
8320 and count defaults to 1.`)
84}