mirror of
https://github.com/onyx-and-iris/lottery-cli.git
synced 2026-08-17 00:34:25 +00:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 12ca7d8fc2 | |||
| 1310447664 |
32
README.md
32
README.md
@@ -20,6 +20,7 @@ go install github.com/onyx-and-iris/lottery-cli/cmd/lottery@latest
|
||||
|
||||
*flags*
|
||||
|
||||
- --kind/-k: The kind of lottery.
|
||||
- --count/-c: 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.
|
||||
@@ -29,21 +30,44 @@ go install github.com/onyx-and-iris/lottery-cli/cmd/lottery@latest
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
export LOTTERY_KIND=lotto
|
||||
export LOTTERY_COUNT=3
|
||||
export LOTTERY_COUNT_PROMPT=false
|
||||
```
|
||||
|
||||
## 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
|
||||
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
|
||||
|
||||
- [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.
|
||||
@@ -32,9 +32,19 @@ func versionFromBuild() string {
|
||||
var cmd = &cobra.Command{
|
||||
Use: "lottery",
|
||||
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 {
|
||||
var selected string
|
||||
|
||||
kindStr := viper.GetString("kind")
|
||||
if kindStr == "" {
|
||||
form := huh.NewForm(
|
||||
huh.NewGroup(
|
||||
huh.NewSelect[string]().
|
||||
@@ -46,15 +56,16 @@ var cmd = &cobra.Command{
|
||||
huh.NewOption("Thunderball", "thunderball"),
|
||||
huh.NewOption("Powerball", "powerball"),
|
||||
).
|
||||
Value(&selected),
|
||||
Value(&kindStr),
|
||||
),
|
||||
)
|
||||
err := form.Run()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
kind, err := lottery.ParseKind(selected)
|
||||
kind, err := lottery.ParseKind(kindStr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -101,6 +112,7 @@ var cmd = &cobra.Command{
|
||||
}
|
||||
|
||||
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().BoolP("count-prompt", "C", false, "Prompt for the number of draws to generate.")
|
||||
|
||||
|
||||
@@ -141,6 +141,11 @@ func renderDrawCollection(title string, entries []string) string {
|
||||
|
||||
separator := separatorStyle.Render(strings.Repeat("─", maxLineWidth(entries)))
|
||||
body := strings.Join(entries, "\n"+separator+"\n")
|
||||
|
||||
return cardStyle.Render(titleStyle.Render(title+" draws") + "\n" + body)
|
||||
if len(entries) == 1 {
|
||||
title = titleStyle.Render(title + " draw")
|
||||
} else {
|
||||
title = titleStyle.Render(title + " draws")
|
||||
}
|
||||
|
||||
return cardStyle.Render(title + "\n" + body)
|
||||
}
|
||||
|
||||
5
kinds.go
5
kinds.go
@@ -25,6 +25,9 @@ func ParseKind(kind string) (Kind, error) {
|
||||
case "powerball":
|
||||
return KindPowerball, nil
|
||||
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,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
4
util.go
4
util.go
@@ -8,8 +8,8 @@ import (
|
||||
// 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.
|
||||
// The result is sorted before being returned.
|
||||
func drawUnique(count, max int) []int {
|
||||
perm := rand.Perm(max)
|
||||
func drawUnique(count, maxNum int) []int {
|
||||
perm := rand.Perm(maxNum)
|
||||
result := make([]int, count)
|
||||
for i := range result {
|
||||
result[i] = perm[i] + 1
|
||||
|
||||
Reference in New Issue
Block a user