add --kind flag, it allows you to configure the lottery kind directly, skipping the selection prompt

update the README with more examples.
This commit is contained in:
2026-07-24 13:11:56 +01:00
parent 3f0af6e5ec
commit 1310447664
4 changed files with 65 additions and 26 deletions

View File

@@ -20,6 +20,7 @@ go install github.com/onyx-and-iris/lottery-cli/cmd/lottery@latest
*flags* *flags*
- --kind/-k: The kind of lottery.
- --count/-c: Number of draws to generate. - --count/-c: Number of draws to generate.
- --count-prompt/-C: Prompt for the number of draws to generate. - --count-prompt/-C: Prompt for the number of draws to generate.
> Note. If both --count and --count-prompt are passed the count prompt will win. > Note. If both --count and --count-prompt are passed the count prompt will win.
@@ -29,19 +30,42 @@ go install github.com/onyx-and-iris/lottery-cli/cmd/lottery@latest
```bash ```bash
#!/usr/bin/env bash #!/usr/bin/env bash
export LOTTERY_KIND=lotto
export LOTTERY_COUNT=3 export LOTTERY_COUNT=3
export LOTTERY_COUNT_PROMPT=false export LOTTERY_COUNT_PROMPT=false
``` ```
## Use ## Use
There are no subcommands, just run the CLI directly passing any desired flags: Run with the selection prompt without prompting for a count:
```console ```console
lottery --count=3 lottery
``` ```
You will then be entered into the selection prompt. Run with the selection prompt but also prompt for a count:
```console
lottery --count-prompt
```
Run with the selection prompt but pass in the count directly:
```console
lottery --count=4
```
Run a single draw directly:
```console
lottery -k=euromillions
```
Run multiple draws directly:
```console
lottery -k=euromillions -c=3
```
## Special Thanks ## Special Thanks

View File

@@ -32,9 +32,19 @@ func versionFromBuild() string {
var cmd = &cobra.Command{ var cmd = &cobra.Command{
Use: "lottery", Use: "lottery",
Short: "A CLI for National Lottery games.", Short: "A CLI for National Lottery games.",
PreRunE: func(cmd *cobra.Command, args []string) error {
kindStr := viper.GetString("kind")
if kindStr != "" {
_, err := lottery.ParseKind(kindStr)
if err != nil {
return err
}
}
return nil
},
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
var selected string kindStr := viper.GetString("kind")
if kindStr == "" {
form := huh.NewForm( form := huh.NewForm(
huh.NewGroup( huh.NewGroup(
huh.NewSelect[string](). huh.NewSelect[string]().
@@ -46,15 +56,16 @@ var cmd = &cobra.Command{
huh.NewOption("Thunderball", "thunderball"), huh.NewOption("Thunderball", "thunderball"),
huh.NewOption("Powerball", "powerball"), huh.NewOption("Powerball", "powerball"),
). ).
Value(&selected), Value(&kindStr),
), ),
) )
err := form.Run() err := form.Run()
if err != nil { if err != nil {
return err return err
} }
}
kind, err := lottery.ParseKind(selected) kind, err := lottery.ParseKind(kindStr)
if err != nil { if err != nil {
return err return err
} }
@@ -101,6 +112,7 @@ var cmd = &cobra.Command{
} }
func init() { func init() {
cmd.Flags().StringP("kind", "k", "", "Lottery kind to generate draws for.")
cmd.Flags().IntP("count", "c", 1, "Number of draws to generate.") cmd.Flags().IntP("count", "c", 1, "Number of draws to generate.")
cmd.Flags().BoolP("count-prompt", "C", false, "Prompt for the number of draws to generate.") cmd.Flags().BoolP("count-prompt", "C", false, "Prompt for the number of draws to generate.")

View File

@@ -25,6 +25,9 @@ func ParseKind(kind string) (Kind, error) {
case "powerball": case "powerball":
return KindPowerball, nil return KindPowerball, nil
default: default:
return "", fmt.Errorf("invalid lottery kind: %s", kind) return "", fmt.Errorf(
"invalid lottery kind: %s, must be one of: lotto, euromillions, setforlife, thunderball, powerball",
kind,
)
} }
} }

View File

@@ -8,8 +8,8 @@ import (
// drawUnique returns count unique numbers in the range [1, max]. // drawUnique returns count unique numbers in the range [1, max].
// It uses the rand.Perm function to generate a random permutation of numbers and selects the first count numbers from it. // It uses the rand.Perm function to generate a random permutation of numbers and selects the first count numbers from it.
// The result is sorted before being returned. // The result is sorted before being returned.
func drawUnique(count, max int) []int { func drawUnique(count, maxNum int) []int {
perm := rand.Perm(max) perm := rand.Perm(maxNum)
result := make([]int, count) result := make([]int, count)
for i := range result { for i := range result {
result[i] = perm[i] + 1 result[i] = perm[i] + 1