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*
|
*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.
|
||||||
@@ -32,29 +32,40 @@ 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]().
|
||||||
Title("Pick a lottery.").
|
Title("Pick a lottery.").
|
||||||
Options(
|
Options(
|
||||||
huh.NewOption("Lotto", "lotto"),
|
huh.NewOption("Lotto", "lotto"),
|
||||||
huh.NewOption("EuroMillions", "euromillions"),
|
huh.NewOption("EuroMillions", "euromillions"),
|
||||||
huh.NewOption("Set For Life", "setforlife"),
|
huh.NewOption("Set For Life", "setforlife"),
|
||||||
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.")
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
5
kinds.go
5
kinds.go
@@ -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,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
4
util.go
4
util.go
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user