Added short variant of the complete flag and refactored flag parsing logic.
All checks were successful
CI / test (push) Successful in 17s
All checks were successful
CI / test (push) Successful in 17s
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,2 +1,2 @@
|
|||||||
bin/
|
bin/
|
||||||
|
triplex
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user