Added short variant of the complete flag and refactored flag parsing logic.
All checks were successful
CI / test (push) Successful in 17s

This commit is contained in:
2026-03-03 00:16:07 +01:00
parent a366e83986
commit 10a120264d
2 changed files with 81 additions and 45 deletions

2
.gitignore vendored
View File

@@ -1,2 +1,2 @@
bin/ bin/
triplex

View File

@@ -14,6 +14,76 @@ import (
"git.hoiting.org/micha/triplex/serial" "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 { func alreadyUsedByClient(idx uint) bool {
return idx%2 == 0 return idx%2 == 0
} }
@@ -32,49 +102,14 @@ func myRandomIndex(max uint) (uint, error) {
} }
func main() { func main() {
complete := flag.String("complete", "", "complete code without checksum in format LLL-NNN-LL") f, err := parseFlags()
encode := flag.String("encode", "", "encode a value to a code") if err != nil {
encodeShort := flag.String("e", "", "alias for --encode") fmt.Println(err)
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")
os.Exit(1) os.Exit(1)
} }
if *complete != "" { if f.complete != "" {
full, idx, err := serial.CompleteCode(*complete) full, idx, err := serial.CompleteCode(f.complete)
if err != nil { if err != nil {
fmt.Println("complete error:", err) fmt.Println("complete error:", err)
os.Exit(1) os.Exit(1)
@@ -82,8 +117,8 @@ func main() {
fmt.Println("code:", full) fmt.Println("code:", full)
fmt.Println("idx:", idx) fmt.Println("idx:", idx)
os.Exit(0) os.Exit(0)
} else if resolvedEncode != "" { } else if f.encode != "" {
n, err := strconv.Atoi(resolvedEncode) n, err := strconv.Atoi(f.encode)
if err != nil { if err != nil {
fmt.Println("invalid number:", err) fmt.Println("invalid number:", err)
os.Exit(1) os.Exit(1)
@@ -97,8 +132,8 @@ func main() {
fmt.Println("code:", code) fmt.Println("code:", code)
fmt.Println("idx:", idx) fmt.Println("idx:", idx)
os.Exit(0) os.Exit(0)
} else if resolvedDecode != "" { } else if f.decode != "" {
code := resolvedDecode code := f.decode
idx, err := serial.Decode(code) idx, err := serial.Decode(code)
if err != nil { if err != nil {
fmt.Println("decode error:", err) fmt.Println("decode error:", err)
@@ -109,6 +144,7 @@ func main() {
os.Exit(0) os.Exit(0)
} }
// Generate a random code
opts := serial.RandomCodeOptions{ opts := serial.RandomCodeOptions{
MaxAttempts: 500, MaxAttempts: 500,
IsInUse: func(idx uint) bool { IsInUse: func(idx uint) bool {