diff --git a/.gitignore b/.gitignore index d855be8..165e6d2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ bin/ - +triplex diff --git a/cmd/triplex/main.go b/cmd/triplex/main.go index 72f1c6d..7750ac4 100644 --- a/cmd/triplex/main.go +++ b/cmd/triplex/main.go @@ -14,6 +14,76 @@ import ( "git.hoiting.org/micha/triplex/serial" ) +type flags struct { + complete string + encode string + decode string +} + +func parseFlags() (*flags, error) { + complete := flag.String("complete", "", "complete code without checksum in format LLL-NNN-LL") + completeShort := flag.String("c", "", "alias for --complete") + encode := flag.String("encode", "", "encode a value to a code") + encodeShort := flag.String("e", "", "alias for --encode") + decode := flag.String("decode", "", "decode code in format LLL-NNN-LLL") + decodeShort := flag.String("d", "", "alias for --decode") + flag.Parse() + + // Resolve complete flag + resolvedComplete := "" + if *complete != "" && *completeShort != "" && *complete != *completeShort { + return nil, fmt.Errorf("flags --complete and -c cannot both be set with different values") + } + if *complete != "" { + resolvedComplete = *complete + } else if *completeShort != "" { + resolvedComplete = *completeShort + } + + // Resolve encode flag + resolvedEncode := "" + if *encode != "" && *encodeShort != "" && *encode != *encodeShort { + return nil, fmt.Errorf("flags --encode and -e cannot both be set with different values") + } + if *encode != "" { + resolvedEncode = *encode + } else if *encodeShort != "" { + resolvedEncode = *encodeShort + } + + // Resolve decode flag + resolvedDecode := "" + if *decode != "" && *decodeShort != "" && *decode != *decodeShort { + return nil, fmt.Errorf("flags --decode and -d cannot both be set with different values") + } + if *decode != "" { + resolvedDecode = *decode + } else if *decodeShort != "" { + resolvedDecode = *decodeShort + } + + // Check mutual exclusivity + selected := 0 + if resolvedComplete != "" { + selected++ + } + if resolvedEncode != "" { + selected++ + } + if resolvedDecode != "" { + selected++ + } + if selected > 1 { + return nil, fmt.Errorf("flags --complete, --encode, and --decode are mutually exclusive") + } + + return &flags{ + complete: resolvedComplete, + encode: resolvedEncode, + decode: resolvedDecode, + }, nil +} + func alreadyUsedByClient(idx uint) bool { return idx%2 == 0 } @@ -32,49 +102,14 @@ func myRandomIndex(max uint) (uint, error) { } func main() { - complete := flag.String("complete", "", "complete code without checksum in format LLL-NNN-LL") - encode := flag.String("encode", "", "encode a value to a code") - encodeShort := flag.String("e", "", "alias for --encode") - decode := flag.String("decode", "", "decode code in format LLL-NNN-LLL") - decodeShort := flag.String("d", "", "alias for --decode") - flag.Parse() - resolvedEncode := "" - if *encode != "" && *encodeShort != "" && *encode != *encodeShort { - fmt.Println("flags --encode and -e cannot both be set with different values") - os.Exit(1) - } - if *encode != "" { - resolvedEncode = *encode - } else if *encodeShort != "" { - resolvedEncode = *encodeShort - } - resolvedDecode := "" - if *decode != "" && *decodeShort != "" && *decode != *decodeShort { - fmt.Println("flags --decode and -d cannot both be set with different values") - os.Exit(1) - } - if *decode != "" { - resolvedDecode = *decode - } else if *decodeShort != "" { - resolvedDecode = *decodeShort - } - selected := 0 - if *complete != "" { - selected++ - } - if resolvedEncode != "" { - selected++ - } - if resolvedDecode != "" { - selected++ - } - if selected > 1 { - fmt.Println("flags --complete, --encode, and --decode are mutually exclusive") + f, err := parseFlags() + if err != nil { + fmt.Println(err) os.Exit(1) } - if *complete != "" { - full, idx, err := serial.CompleteCode(*complete) + if f.complete != "" { + full, idx, err := serial.CompleteCode(f.complete) if err != nil { fmt.Println("complete error:", err) os.Exit(1) @@ -82,8 +117,8 @@ func main() { fmt.Println("code:", full) fmt.Println("idx:", idx) os.Exit(0) - } else if resolvedEncode != "" { - n, err := strconv.Atoi(resolvedEncode) + } else if f.encode != "" { + n, err := strconv.Atoi(f.encode) if err != nil { fmt.Println("invalid number:", err) os.Exit(1) @@ -97,8 +132,8 @@ func main() { fmt.Println("code:", code) fmt.Println("idx:", idx) os.Exit(0) - } else if resolvedDecode != "" { - code := resolvedDecode + } else if f.decode != "" { + code := f.decode idx, err := serial.Decode(code) if err != nil { fmt.Println("decode error:", err) @@ -109,6 +144,7 @@ func main() { os.Exit(0) } + // Generate a random code opts := serial.RandomCodeOptions{ MaxAttempts: 500, IsInUse: func(idx uint) bool {