diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 8ff0f94..5fd7cb7 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -31,7 +31,7 @@ on:
- main
env:
- VERSION_NUMBER: 'v1.8.9'
+ VERSION_NUMBER: 'v1.8.10'
DOCKERHUB_REGISTRY_NAME: 'digitalghostdev/poke-cli'
AWS_REGION: 'us-west-2'
diff --git a/.goreleaser.yml b/.goreleaser.yml
index e2944c1..1a6d47d 100644
--- a/.goreleaser.yml
+++ b/.goreleaser.yml
@@ -14,7 +14,7 @@ builds:
- windows
- darwin
ldflags:
- - -s -w -X main.version=v1.8.9
+ - -s -w -X main.version=v1.8.10
archives:
- formats: [ 'zip' ]
diff --git a/Dockerfile b/Dockerfile
index 7261655..c75bf05 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,7 +8,7 @@ RUN go mod download
COPY . .
-RUN go build -ldflags "-X main.version=v1.8.9" -o poke-cli .
+RUN go build -ldflags "-X main.version=v1.8.10" -o poke-cli .
# build 2
FROM --platform=$BUILDPLATFORM alpine:3.23
diff --git a/README.md b/README.md
index bdf0a4e..b2c28cb 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
-
+
@@ -99,11 +99,11 @@ Cloudsmith is a fully cloud-based service that lets you easily create, store, an
3. Choose how to interact with the container:
* Run a single command and exit:
```bash
- docker run --rm -it digitalghostdev/poke-cli:v1.8.9 [subcommand] [flag]
+ docker run --rm -it digitalghostdev/poke-cli:v1.8.10 [subcommand] [flag]
```
* Enter the container and use its shell:
```bash
- docker run --rm -it --name poke-cli --entrypoint /bin/sh digitalghostdev/poke-cli:v1.8.9 -c "cd /app && exec sh"
+ docker run --rm -it --name poke-cli --entrypoint /bin/sh digitalghostdev/poke-cli:v1.8.10 -c "cd /app && exec sh"
# placed into the /app directory, run the program with './poke-cli'
# example: ./poke-cli ability swift-swim
```
@@ -118,7 +118,7 @@ Cloudsmith is a fully cloud-based service that lets you easily create, store, an
6. Run the tool!
> [!IMPORTANT]
-> For macOS, you may have to allow the executable to run as it is not signed. Head to System Settings > Privacy & Security > scroll down and allow executable to run.
+> For macOS, you may have to allow the executable to run as it is not signed. Head to System Settings > Privacy & Security > scroll down and allow the executable to run.
diff --git a/card_data/pipelines/poke_cli_dbt/dbt_project.yml b/card_data/pipelines/poke_cli_dbt/dbt_project.yml
index ace000b..5b5ab59 100644
--- a/card_data/pipelines/poke_cli_dbt/dbt_project.yml
+++ b/card_data/pipelines/poke_cli_dbt/dbt_project.yml
@@ -1,5 +1,5 @@
name: 'poke_cli_dbt'
-version: '1.8.9'
+version: '1.8.10'
profile: 'poke_cli_dbt'
diff --git a/card_data/pyproject.toml b/card_data/pyproject.toml
index 3e1a108..baae3e1 100644
--- a/card_data/pyproject.toml
+++ b/card_data/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "card-data"
-version = "1.5.2"
+version = "1.8.10"
description = "File directory to store all data related processes for the Pokémon TCG."
readme = "README.md"
requires-python = ">=3.12"
diff --git a/cmd/ability/ability.go b/cmd/ability/ability.go
index 76d8e30..c9865f9 100644
--- a/cmd/ability/ability.go
+++ b/cmd/ability/ability.go
@@ -37,9 +37,7 @@ func AbilityCommand() (string, error) {
return output.String(), nil
}
- flag.Parse()
-
- if err := utils.ValidateAbilityArgs(args); err != nil {
+ if err := utils.ValidateArgs(args, utils.Validator{MaxArgs: 4, CmdName: "ability", RequireName: true, HasFlags: true}); err != nil {
output.WriteString(err.Error())
return output.String(), err
}
diff --git a/cmd/berry/berry.go b/cmd/berry/berry.go
index 2cbef10..171946c 100644
--- a/cmd/berry/berry.go
+++ b/cmd/berry/berry.go
@@ -37,7 +37,7 @@ func BerryCommand() (string, error) {
flag.Parse()
// Validate arguments
- if err := utils.ValidateBerryArgs(os.Args); err != nil {
+ if err := utils.ValidateArgs(os.Args, utils.Validator{MaxArgs: 3, CmdName: "berry", RequireName: false, HasFlags: false}); err != nil {
output.WriteString(err.Error())
return output.String(), err
}
diff --git a/cmd/card/card.go b/cmd/card/card.go
index a5cc8a9..700c822 100644
--- a/cmd/card/card.go
+++ b/cmd/card/card.go
@@ -33,7 +33,7 @@ func CardCommand() (string, error) {
flag.Parse()
// Validate arguments
- if err := utils.ValidateCardArgs(os.Args); err != nil {
+ if err := utils.ValidateArgs(os.Args, utils.Validator{MaxArgs: 3, CmdName: "card", RequireName: false, HasFlags: false}); err != nil {
output.WriteString(err.Error())
return output.String(), err
}
diff --git a/cmd/card/cardlist.go b/cmd/card/cardlist.go
index f168318..cead01d 100644
--- a/cmd/card/cardlist.go
+++ b/cmd/card/cardlist.go
@@ -19,6 +19,7 @@ var getCardData = connections.CallTCGData
type CardsModel struct {
AllRows []table.Row
Choice string
+ Error error
IllustratorMap map[string]string
ImageMap map[string]string
Loading bool
@@ -62,7 +63,7 @@ func cardTableStyles(selectedBg lipgloss.Color) table.Styles {
return s
}
-func (m *CardsModel) syncTableStylesForFocus() {
+func syncTableStylesForFocus(m *CardsModel) {
if m.Search.Focused() {
m.TableStyles = cardTableStyles(inactiveTableSelectedBg)
} else {
@@ -146,7 +147,7 @@ func (m CardsModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
if m.Search.Focused() {
m.Search.Blur()
m.Table.Focus()
- m.syncTableStylesForFocus()
+ syncTableStylesForFocus(&m)
return m, nil
}
m.Quitting = true
@@ -168,15 +169,16 @@ func (m CardsModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.Table.Blur()
m.Search.Focus()
}
- m.syncTableStylesForFocus()
+ syncTableStylesForFocus(&m)
return m, nil
}
case cardDataMsg:
// Data arrived - stop loading and build the table
if msg.err != nil {
- m.Quitting = true
- return m, tea.Quit
+ m.Error = msg.err
+ m.Loading = false
+ return m, nil
}
ti := textinput.New()
@@ -219,7 +221,7 @@ func (m CardsModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
prev := m.Search.Value()
m.Search, bubbleCmd = m.Search.Update(msg)
if m.Search.Value() != prev {
- m.applyFilter()
+ applyFilter(&m)
}
} else {
m.Table, bubbleCmd = m.Table.Update(msg)
@@ -237,7 +239,7 @@ func (m CardsModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, bubbleCmd
}
-func (m *CardsModel) applyFilter() {
+func applyFilter(m *CardsModel) {
q := strings.TrimSpace(strings.ToLower(m.Search.Value()))
if q == "" {
m.Table.SetRows(m.AllRows)
@@ -263,6 +265,13 @@ func (m CardsModel) View() string {
if m.Quitting {
return "\n Quitting card search...\n\n"
}
+ if m.Error != nil {
+ return styling.ApiErrorStyle.Render(
+ "Error loading cards from Supabase:\n" +
+ m.Error.Error() + "\n\n" +
+ "Press ctrl+c or esc to exit.",
+ )
+ }
if m.Loading {
return lipgloss.NewStyle().Padding(2).Render(
m.Spinner.View() + " Loading cards...",
diff --git a/cmd/card/cardlist_test.go b/cmd/card/cardlist_test.go
index 6da8922..8563fbd 100644
--- a/cmd/card/cardlist_test.go
+++ b/cmd/card/cardlist_test.go
@@ -351,7 +351,7 @@ func TestCardDataMsg_PopulatesModel(t *testing.T) {
}
}
-func TestCardDataMsg_Error_QuitsModel(t *testing.T) {
+func TestCardDataMsg_Error_StoresError(t *testing.T) {
model, _ := CardsList("set123")
// Simulate receiving an error via cardDataMsg
@@ -362,12 +362,20 @@ func TestCardDataMsg_Error_QuitsModel(t *testing.T) {
newModel, cmd := model.Update(msg)
resultModel := newModel.(CardsModel)
- if !resultModel.Quitting {
- t.Error("Quitting should be true when error received")
+ if resultModel.Error == nil {
+ t.Error("Error should be set when error received")
}
- if cmd == nil {
- t.Error("Should return tea.Quit command on error")
+ if resultModel.Error.Error() != "network error" {
+ t.Errorf("Expected error message 'network error', got '%s'", resultModel.Error.Error())
+ }
+
+ if resultModel.Loading {
+ t.Error("Loading should be false after error")
+ }
+
+ if cmd != nil {
+ t.Error("Should not return a command on error (stays in view to show error)")
}
}
diff --git a/cmd/card/setslist.go b/cmd/card/setslist.go
index 2c328a3..5c116c0 100644
--- a/cmd/card/setslist.go
+++ b/cmd/card/setslist.go
@@ -2,7 +2,6 @@ package card
import (
"encoding/json"
- "fmt"
"github.com/charmbracelet/bubbles/list"
"github.com/charmbracelet/bubbles/spinner"
@@ -16,6 +15,7 @@ var getSetsData = connections.CallTCGData
type SetsModel struct {
Choice string
+ Error error
Loading bool
List list.Model
Quitting bool
@@ -79,6 +79,9 @@ func (m SetsModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.Quitting = true
return m, tea.Quit
case "enter":
+ if m.Error != nil {
+ return m, nil
+ }
i, ok := m.List.SelectedItem().(item)
if ok {
m.Choice = string(i)
@@ -90,15 +93,16 @@ func (m SetsModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
case setsDataMsg:
// Data arrived - stop loading and build the list
if msg.err != nil {
- m.Quitting = true
- return m, tea.Quit
+ m.Error = msg.err
+ m.Loading = false
+ return m, nil
}
const listWidth = 20
const listHeight = 20
l := list.New(msg.items, itemDelegate{}, listWidth, listHeight)
- l.Title = fmt.Sprintf("Pick a set from the %s series", msg.seriesID)
+ l.Title = "Choose a set!"
l.SetShowStatusBar(false)
l.SetFilteringEnabled(false)
l.Styles.Title = titleStyle
@@ -116,14 +120,14 @@ func (m SetsModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, cmd
case tea.WindowSizeMsg:
- if !m.Loading {
+ if !m.Loading && m.Error == nil {
m.List.SetWidth(msg.Width)
}
return m, nil
}
// Only update the list if it's been initialized
- if !m.Loading {
+ if !m.Loading && m.Error == nil {
var cmd tea.Cmd
m.List, cmd = m.List.Update(msg)
return m, cmd
@@ -132,6 +136,13 @@ func (m SetsModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
func (m SetsModel) View() string {
+ if m.Error != nil {
+ return styling.ApiErrorStyle.Render(
+ "Error loading sets from Supabase:\n" +
+ m.Error.Error() + "\n\n" +
+ "Press ctrl+c or esc to exit.",
+ )
+ }
if m.Choice != "" {
return quitTextStyle.Render("Set selected:", m.Choice)
}
diff --git a/cmd/card/setslist_test.go b/cmd/card/setslist_test.go
index ee2d917..042c1a7 100644
--- a/cmd/card/setslist_test.go
+++ b/cmd/card/setslist_test.go
@@ -238,7 +238,7 @@ func TestSetsDataMsg_PopulatesModel(t *testing.T) {
}
}
-func TestSetsDataMsg_Error_QuitsModel(t *testing.T) {
+func TestSetsDataMsg_Error_StoresError(t *testing.T) {
model, _ := SetsList("sv")
// Simulate receiving an error via setsDataMsg
@@ -249,12 +249,20 @@ func TestSetsDataMsg_Error_QuitsModel(t *testing.T) {
newModel, cmd := model.Update(msg)
resultModel := newModel.(SetsModel)
- if !resultModel.Quitting {
- t.Error("Quitting should be true when error received")
+ if resultModel.Error == nil {
+ t.Error("Error should be set when error received")
}
- if cmd == nil {
- t.Error("Should return tea.Quit command on error")
+ if resultModel.Error.Error() != "network error" {
+ t.Errorf("Expected error message 'network error', got '%s'", resultModel.Error.Error())
+ }
+
+ if resultModel.Loading {
+ t.Error("Loading should be false after error")
+ }
+
+ if cmd != nil {
+ t.Error("Should not return a command on error (stays in view to show error)")
}
}
diff --git a/cmd/item/item.go b/cmd/item/item.go
index 52305a0..ff1bfed 100644
--- a/cmd/item/item.go
+++ b/cmd/item/item.go
@@ -37,7 +37,7 @@ func ItemCommand() (string, error) {
flag.Parse()
- if err := utils.ValidateItemArgs(os.Args); err != nil {
+ if err := utils.ValidateArgs(os.Args, utils.Validator{MaxArgs: 3, CmdName: "item", RequireName: true, HasFlags: false}); err != nil {
output.WriteString(err.Error())
return output.String(), err
}
diff --git a/cmd/move/move.go b/cmd/move/move.go
index 37db39e..a03c79c 100644
--- a/cmd/move/move.go
+++ b/cmd/move/move.go
@@ -38,7 +38,7 @@ func MoveCommand() (string, error) {
flag.Parse()
- if err := utils.ValidateMoveArgs(os.Args); err != nil {
+ if err := utils.ValidateArgs(os.Args, utils.Validator{MaxArgs: 3, CmdName: "move", RequireName: true, HasFlags: false}); err != nil {
output.WriteString(err.Error())
return output.String(), err
}
diff --git a/cmd/natures/natures.go b/cmd/natures/natures.go
index f12200c..e3d7bba 100644
--- a/cmd/natures/natures.go
+++ b/cmd/natures/natures.go
@@ -30,7 +30,7 @@ func NaturesCommand() (string, error) {
flag.Parse()
- if err := utils.ValidateNaturesArgs(os.Args); err != nil {
+ if err := utils.ValidateArgs(os.Args, utils.Validator{MaxArgs: 3, CmdName: "natures", RequireName: false, HasFlags: false}); err != nil {
output.WriteString(err.Error())
return output.String(), err
}
diff --git a/cmd/pokemon/pokemon.go b/cmd/pokemon/pokemon.go
index 84c23ae..b9de1dd 100644
--- a/cmd/pokemon/pokemon.go
+++ b/cmd/pokemon/pokemon.go
@@ -53,11 +53,9 @@ func PokemonCommand() (string, error) {
return output.String(), nil
}
- flag.Parse()
-
err := utils.ValidatePokemonArgs(args)
if err != nil {
- output.WriteString(err.Error()) // This is the styled error
+ output.WriteString(err.Error())
return output.String(), err
}
diff --git a/cmd/search/search.go b/cmd/search/search.go
index f67109e..5ea0a54 100644
--- a/cmd/search/search.go
+++ b/cmd/search/search.go
@@ -32,7 +32,7 @@ func SearchCommand() error {
flag.Parse()
- if err := utils.ValidateSearchArgs(os.Args); err != nil {
+ if err := utils.ValidateArgs(os.Args, utils.Validator{MaxArgs: 3, CmdName: "search", RequireName: false, HasFlags: false}); err != nil {
fmt.Println(err.Error())
return err
}
diff --git a/cmd/speed/speed.go b/cmd/speed/speed.go
index b30e3f7..266c03c 100644
--- a/cmd/speed/speed.go
+++ b/cmd/speed/speed.go
@@ -112,7 +112,7 @@ func SpeedCommand() (string, error) {
flag.Parse()
// Validate arguments
- if err := utils.ValidateSpeedArgs(os.Args); err != nil {
+ if err := utils.ValidateArgs(os.Args, utils.Validator{MaxArgs: 3, CmdName: "speed", RequireName: false, HasFlags: false}); err != nil {
output.WriteString(err.Error())
return output.String(), err
}
diff --git a/cmd/types/types.go b/cmd/types/types.go
index db0f483..c15789b 100644
--- a/cmd/types/types.go
+++ b/cmd/types/types.go
@@ -35,7 +35,7 @@ func TypesCommand() (string, error) {
flag.Parse()
// Validate arguments
- if err := utils.ValidateTypesArgs(os.Args); err != nil {
+ if err := utils.ValidateArgs(os.Args, utils.Validator{MaxArgs: 3, CmdName: "types", RequireName: false, HasFlags: false}); err != nil {
output.WriteString(err.Error())
return output.String(), err
}
diff --git a/cmd/utils/validateargs.go b/cmd/utils/validateargs.go
index ab2d80c..25bc763 100644
--- a/cmd/utils/validateargs.go
+++ b/cmd/utils/validateargs.go
@@ -7,6 +7,13 @@ import (
"github.com/digitalghost-dev/poke-cli/styling"
)
+type Validator struct {
+ MaxArgs int
+ CmdName string
+ RequireName bool
+ HasFlags bool
+}
+
// checkLength checks if the number of arguments is lower than the max value. Helper Function.
func checkLength(args []string, max int) error {
if len(args) > max {
@@ -22,90 +29,24 @@ func checkLength(args []string, max int) error {
func checkNoOtherOptions(args []string, max int, commandName string) error {
if len(args) == max && args[2] != "-h" && args[2] != "--help" {
errMsg := styling.ErrorColor.Render("✖ Error!") +
- "\nThe only available options after the\n" + commandName + " command are '-h' or '--help'"
+ "\nThe only available options after the\n" + "<" + commandName + "> command are '-h' or '--help'"
return fmt.Errorf("%s", styling.ErrorBorder.Render(errMsg))
}
return nil
}
-// ValidateAbilityArgs validates the command line arguments
-func ValidateAbilityArgs(args []string) error {
- if err := checkLength(args, 4); err != nil {
- return err
- }
-
- if len(args) == 2 {
- errMessage := styling.ErrorBorder.Render(styling.ErrorColor.Render("✖ Error!"), "\nPlease specify an ability")
- return fmt.Errorf("%s", errMessage)
- }
-
- return nil
-}
-
-// ValidateBerryArgs validates the command line arguments
-func ValidateBerryArgs(args []string) error {
- if err := checkLength(args, 3); err != nil {
+func ValidateArgs(args []string, v Validator) error {
+ if err := checkLength(args, v.MaxArgs); err != nil {
return err
}
-
- if err := checkNoOtherOptions(args, 3, ""); err != nil {
- return err
- }
-
- return nil
-}
-
-// ValidateCardArgs validates the command line arguments
-func ValidateCardArgs(args []string) error {
- if err := checkLength(args, 3); err != nil {
- return err
+ if v.RequireName && len(args) == 2 {
+ return fmt.Errorf("✖ Error! Please specify a(n) %s", v.CmdName)
}
-
- if err := checkNoOtherOptions(args, 3, ""); err != nil {
- return err
- }
-
- return nil
-}
-
-// ValidateItemArgs validates the command line arguments
-func ValidateItemArgs(args []string) error {
- if err := checkLength(args, 3); err != nil {
- return err
- }
-
- if len(args) == 2 {
- errMessage := styling.ErrorBorder.Render(styling.ErrorColor.Render("✖ Error!"), "\nPlease specify an item ")
- return fmt.Errorf("%s", errMessage)
- }
-
- return nil
-}
-
-// ValidateMoveArgs validates the command line arguments
-func ValidateMoveArgs(args []string) error {
- if err := checkLength(args, 3); err != nil {
- return err
- }
-
- if len(args) == 2 {
- errMessage := styling.ErrorBorder.Render(styling.ErrorColor.Render("✖ Error!"), "\nPlease specify a move ")
- return fmt.Errorf("%s", errMessage)
+ if !v.HasFlags && !v.RequireName {
+ if err := checkNoOtherOptions(args, v.MaxArgs, v.CmdName); err != nil {
+ return err
+ }
}
-
- return nil
-}
-
-// ValidateNaturesArgs validates the command line arguments
-func ValidateNaturesArgs(args []string) error {
- if err := checkLength(args, 3); err != nil {
- return err
- }
-
- if err := checkNoOtherOptions(args, 3, ""); err != nil {
- return err
- }
-
return nil
}
@@ -176,42 +117,3 @@ func ValidatePokemonArgs(args []string) error {
return nil
}
-
-// ValidateSearchArgs validates the command line arguments
-func ValidateSearchArgs(args []string) error {
- if err := checkLength(args, 3); err != nil {
- return err
- }
-
- if err := checkNoOtherOptions(args, 3, ""); err != nil {
- return err
- }
-
- return nil
-}
-
-// ValidateSpeedArgs validates the command line arguments
-func ValidateSpeedArgs(args []string) error {
- if err := checkLength(args, 3); err != nil {
- return err
- }
-
- if err := checkNoOtherOptions(args, 3, ""); err != nil {
- return err
- }
-
- return nil
-}
-
-// ValidateTypesArgs validates the command line arguments
-func ValidateTypesArgs(args []string) error {
- if err := checkLength(args, 3); err != nil {
- return err
- }
-
- if err := checkNoOtherOptions(args, 3, ""); err != nil {
- return err
- }
-
- return nil
-}
diff --git a/cmd/utils/validateargs_test.go b/cmd/utils/validateargs_test.go
index c261716..aadfd2d 100644
--- a/cmd/utils/validateargs_test.go
+++ b/cmd/utils/validateargs_test.go
@@ -73,7 +73,7 @@ func TestValidateAbilityArgs(t *testing.T) {
}
for _, input := range validInputs {
- err := ValidateAbilityArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 4, CmdName: "ability", RequireName: true, HasFlags: true})
require.NoError(t, err, "Expected no error for valid input")
}
@@ -83,7 +83,7 @@ func TestValidateAbilityArgs(t *testing.T) {
}
for _, input := range invalidInputs {
- err := ValidateAbilityArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 4, CmdName: "ability", RequireName: true, HasFlags: true})
require.Error(t, err, "Expected error for invalid input")
}
@@ -95,7 +95,7 @@ func TestValidateAbilityArgs(t *testing.T) {
expectedError := styling.StripANSI("╭──────────────────╮\n│✖ Error! │\n│Too many arguments│\n╰──────────────────╯")
for _, input := range tooManyArgs {
- err := ValidateAbilityArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 4, CmdName: "ability", RequireName: true, HasFlags: true})
if err == nil {
t.Fatalf("Expected an error for input %v, but got nil", input)
@@ -114,7 +114,7 @@ func TestValidateNaturesArgs(t *testing.T) {
}
for _, input := range validInputs {
- err := ValidateNaturesArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "natures", RequireName: false, HasFlags: false})
require.NoError(t, err, "Expected no error for valid input")
}
@@ -125,7 +125,7 @@ func TestValidateNaturesArgs(t *testing.T) {
}
for _, input := range invalidInputs {
- err := ValidateNaturesArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "natures", RequireName: false, HasFlags: false})
assert.Error(t, err, "Expected error for invalid input")
}
}
@@ -191,7 +191,7 @@ func TestValidateBerryArgs(t *testing.T) {
}
for _, input := range validInputs {
- err := ValidateBerryArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "berry", RequireName: false, HasFlags: false})
require.NoError(t, err, "Expected no error for valid input")
}
@@ -200,7 +200,7 @@ func TestValidateBerryArgs(t *testing.T) {
}
for _, input := range invalidInputs {
- err := ValidateBerryArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "berry", RequireName: false, HasFlags: false})
require.Error(t, err, "Expected error for invalid input")
}
@@ -211,7 +211,7 @@ func TestValidateBerryArgs(t *testing.T) {
expectedError := styling.StripANSI("╭──────────────────╮\n│✖ Error! │\n│Too many arguments│\n╰──────────────────╯")
for _, input := range tooManyArgs {
- err := ValidateBerryArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "berry", RequireName: false, HasFlags: false})
if err == nil {
t.Fatalf("Expected an error for input %v, but got nil", input)
@@ -230,7 +230,7 @@ func TestValidateCardArgs(t *testing.T) {
}
for _, input := range validInputs {
- err := ValidateCardArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "card", RequireName: false, HasFlags: false})
require.NoError(t, err, "Expected no error for valid input")
}
@@ -239,7 +239,7 @@ func TestValidateCardArgs(t *testing.T) {
}
for _, input := range invalidInputs {
- err := ValidateCardArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "card", RequireName: false, HasFlags: false})
require.Error(t, err, "Expected error for invalid input")
}
@@ -250,7 +250,7 @@ func TestValidateCardArgs(t *testing.T) {
expectedError := styling.StripANSI("╭──────────────────╮\n│✖ Error! │\n│Too many arguments│\n╰──────────────────╯")
for _, input := range tooManyArgs {
- err := ValidateCardArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "card", RequireName: false, HasFlags: false})
if err == nil {
t.Fatalf("Expected an error for input %v, but got nil", input)
@@ -270,7 +270,7 @@ func TestValidateItemArgs(t *testing.T) {
}
for _, input := range validInputs {
- err := ValidateItemArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "item", RequireName: true, HasFlags: false})
require.NoError(t, err, "Expected no error for valid input")
}
@@ -279,7 +279,7 @@ func TestValidateItemArgs(t *testing.T) {
}
for _, input := range invalidInputs {
- err := ValidateItemArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "item", RequireName: true, HasFlags: false})
require.Error(t, err, "Expected error for invalid input")
}
@@ -290,7 +290,7 @@ func TestValidateItemArgs(t *testing.T) {
expectedError := styling.StripANSI("╭──────────────────╮\n│✖ Error! │\n│Too many arguments│\n╰──────────────────╯")
for _, input := range tooManyArgs {
- err := ValidateItemArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "item", RequireName: true, HasFlags: false})
if err == nil {
t.Fatalf("Expected an error for input %v, but got nil", input)
@@ -310,7 +310,7 @@ func TestValidateMoveArgs(t *testing.T) {
}
for _, input := range validInputs {
- err := ValidateMoveArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "move", RequireName: true, HasFlags: false})
require.NoError(t, err, "Expected no error for valid input")
}
@@ -319,7 +319,7 @@ func TestValidateMoveArgs(t *testing.T) {
}
for _, input := range invalidInputs {
- err := ValidateMoveArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "move", RequireName: true, HasFlags: false})
require.Error(t, err, "Expected error for invalid input")
}
@@ -330,7 +330,7 @@ func TestValidateMoveArgs(t *testing.T) {
expectedError := styling.StripANSI("╭──────────────────╮\n│✖ Error! │\n│Too many arguments│\n╰──────────────────╯")
for _, input := range tooManyArgs {
- err := ValidateMoveArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "move", RequireName: true, HasFlags: false})
if err == nil {
t.Fatalf("Expected an error for input %v, but got nil", input)
@@ -349,7 +349,7 @@ func TestValidateSearchArgs(t *testing.T) {
}
for _, input := range validInputs {
- err := ValidateSearchArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "search", RequireName: false, HasFlags: false})
require.NoError(t, err, "Expected no error for valid input")
}
@@ -358,7 +358,7 @@ func TestValidateSearchArgs(t *testing.T) {
}
for _, input := range invalidInputs {
- err := ValidateSearchArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "search", RequireName: false, HasFlags: false})
require.Error(t, err, "Expected error for invalid input")
}
@@ -369,7 +369,7 @@ func TestValidateSearchArgs(t *testing.T) {
expectedError := styling.StripANSI("╭──────────────────╮\n│✖ Error! │\n│Too many arguments│\n╰──────────────────╯")
for _, input := range tooManyArgs {
- err := ValidateSearchArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "search", RequireName: false, HasFlags: false})
if err == nil {
t.Fatalf("Expected an error for input %v, but got nil", input)
@@ -389,7 +389,7 @@ func TestValidateTypesArgs(t *testing.T) {
}
for _, input := range validInputs {
- err := ValidateTypesArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "types", RequireName: false, HasFlags: false})
require.NoError(t, err, "Expected no error for valid input")
}
@@ -399,7 +399,7 @@ func TestValidateTypesArgs(t *testing.T) {
}
for _, input := range invalidInputs {
- err := ValidateTypesArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "types", RequireName: false, HasFlags: false})
require.Error(t, err, "Expected error for invalid input")
}
@@ -411,7 +411,7 @@ func TestValidateTypesArgs(t *testing.T) {
expectedError := styling.StripANSI("╭──────────────────╮\n│✖ Error! │\n│Too many arguments│\n╰──────────────────╯")
for _, input := range tooManyArgs {
- err := ValidateTypesArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "types", RequireName: false, HasFlags: false})
if err == nil {
t.Fatalf("Expected an error for input %v, but got nil", input)
@@ -430,7 +430,7 @@ func TestValidateSpeedArgs(t *testing.T) {
}
for _, input := range validInputs {
- err := ValidateSpeedArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "speed", RequireName: false, HasFlags: false})
require.NoError(t, err, "Expected no error for valid input")
}
@@ -439,7 +439,7 @@ func TestValidateSpeedArgs(t *testing.T) {
}
for _, input := range invalidInputs {
- err := ValidateSpeedArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "speed", RequireName: false, HasFlags: false})
require.Error(t, err, "Expected error for invalid input")
}
@@ -450,7 +450,7 @@ func TestValidateSpeedArgs(t *testing.T) {
expectedError := styling.StripANSI("╭──────────────────╮\n│✖ Error! │\n│Too many arguments│\n╰──────────────────╯")
for _, input := range tooManyArgs {
- err := ValidateSpeedArgs(input)
+ err := ValidateArgs(input, Validator{MaxArgs: 3, CmdName: "speed", RequireName: false, HasFlags: false})
if err == nil {
t.Fatalf("Expected an error for input %v, but got nil", input)
diff --git a/nfpm.yaml b/nfpm.yaml
index 32cf979..2ab7df1 100644
--- a/nfpm.yaml
+++ b/nfpm.yaml
@@ -1,7 +1,7 @@
name: "poke-cli"
arch: "arm64"
platform: "linux"
-version: "v1.8.9"
+version: "v1.8.10"
section: "default"
version_schema: semver
maintainer: "Christian S"
diff --git a/styling/styling.go b/styling/styling.go
index ecc1db1..1bfa5d7 100644
--- a/styling/styling.go
+++ b/styling/styling.go
@@ -53,6 +53,10 @@ var (
ErrorBorder = lipgloss.NewStyle().
BorderStyle(lipgloss.RoundedBorder()).
BorderForeground(lipgloss.Color("#F2055C"))
+ ApiErrorStyle = lipgloss.NewStyle().
+ Foreground(lipgloss.Color("#FF0000")).
+ Bold(true).
+ Padding(1, 2)
WarningColor = lipgloss.NewStyle().Foreground(lipgloss.Color("#FF8C00"))
WarningBorder = lipgloss.NewStyle().
BorderStyle(lipgloss.RoundedBorder()).
diff --git a/testdata/main_latest_flag.golden b/testdata/main_latest_flag.golden
index 1b82be8..9c8aec0 100644
--- a/testdata/main_latest_flag.golden
+++ b/testdata/main_latest_flag.golden
@@ -2,6 +2,6 @@
┃ ┃
┃ Latest available release ┃
┃ on GitHub: ┃
-┃ • v1.8.8 ┃
+┃ • v1.8.9 ┃
┃ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛