2 Commits

Author SHA1 Message Date
12ca7d8fc2 pluralise draw only if entries>1 2026-07-24 16:21:18 +01:00
1310447664 add --kind flag, it allows you to configure the lottery kind directly, skipping the selection prompt
update the README with more examples.
2026-07-24 13:11:56 +01:00
5 changed files with 72 additions and 28 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,21 +30,44 @@ 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
- [spf13](https://github.com/spf13) for the [cobra](https://github.com/spf13/cobra) package. - [spf13](https://github.com/spf13) for the [cobra](https://github.com/spf13/cobra) and [viper](https://github.com/spf13/viper) packages.
- [Charm](https://github.com/charmbracelet) developers for the [fang](https://github.com/charmbracelet/fang), [lipgloss](https://github.com/charmbracelet/lipgloss) and [huh](https://github.com/charmbracelet/huh) packages. - [Charm](https://github.com/charmbracelet) developers for the [fang](https://github.com/charmbracelet/fang), [lipgloss](https://github.com/charmbracelet/lipgloss) and [huh](https://github.com/charmbracelet/huh) packages.

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

@@ -141,6 +141,11 @@ func renderDrawCollection(title string, entries []string) string {
separator := separatorStyle.Render(strings.Repeat("─", maxLineWidth(entries))) separator := separatorStyle.Render(strings.Repeat("─", maxLineWidth(entries)))
body := strings.Join(entries, "\n"+separator+"\n") body := strings.Join(entries, "\n"+separator+"\n")
if len(entries) == 1 {
title = titleStyle.Render(title + " draw")
} else {
title = titleStyle.Render(title + " draws")
}
return cardStyle.Render(titleStyle.Render(title+" draws") + "\n" + body) return cardStyle.Render(title + "\n" + body)
} }

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