diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2063023..578d575 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ on: - main env: - VERSION_NUMBER: 'v1.3.1' + VERSION_NUMBER: 'v1.3.2' DOCKERHUB_REGISTRY_NAME: 'digitalghostdev/poke-cli' AWS_REGION: 'us-west-2' diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 9261260..f73112f 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -14,7 +14,7 @@ builds: - windows - darwin ldflags: - - -s -w -X main.version=v1.3.1 + - -s -w -X main.version=v1.3.2 archives: - format: tar.gz diff --git a/Dockerfile b/Dockerfile index 58c5754..5b30230 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ RUN go mod download COPY . . -RUN go build -ldflags "-X main.version=v1.3.1" -o poke-cli . +RUN go build -ldflags "-X main.version=v1.3.2" -o poke-cli . # build 2 FROM --platform=$BUILDPLATFORM alpine:latest diff --git a/README.md b/README.md index d2aca96..e1fc1bd 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ pokemon-logo

Pokémon CLI

version-label - docker-image-size + docker-image-size ci-status-badge
@@ -76,11 +76,11 @@ View future plans in the [Roadmap](#roadmap) section. 3. Choose how to interact with the container: * Run a single command and exit: ```bash - docker run --rm -it digitalghostdev/poke-cli:v1.3.1 [subcommand] flag] + docker run --rm -it digitalghostdev/poke-cli:v1.3.2 [subcommand] flag] ``` * Enter the container and use its shell: ```bash - docker run --rm -it --name poke-cli --entrypoint /bin/sh digitalghostdev/poke-cli:v1.3.1 -c "cd /app && exec sh" + docker run --rm -it --name poke-cli --entrypoint /bin/sh digitalghostdev/poke-cli:v1.3.2 -c "cd /app && exec sh" # placed into the /app directory, run the program with './poke-cli' # example: ./poke-cli ability swift-swim ``` diff --git a/flags/pokemonflagset.go b/flags/pokemonflagset.go index 45d17dc..8fb4dcf 100644 --- a/flags/pokemonflagset.go +++ b/flags/pokemonflagset.go @@ -20,6 +20,7 @@ import ( "sort" "strconv" "strings" + "sync" ) func header(header string) string { @@ -225,37 +226,72 @@ func MovesFlag(w io.Writer, endpoint string, pokemonName string) error { var moves []MoveInfo + movesChan := make(chan MoveInfo) + errorsChan := make(chan error) + + var wg sync.WaitGroup + + // Count eligible moves for concurrency + eligibleMoves := 0 for _, pokeMove := range pokemonStruct.Moves { for _, detail := range pokeMove.VersionGroupDetails { if detail.VersionGroup.Name != "scarlet-violet" || detail.MoveLearnedMethod.Name != "level-up" { continue } - moveName := pokeMove.Move.Name - moveStruct, _, err := connections.MoveApiCall("move", moveName, baseURL) - if err != nil { - log.Printf("Error fetching move %s: %v", moveName, err) + eligibleMoves++ + wg.Add(1) + go func(moveName string, level int) { + defer wg.Done() + + moveStruct, _, err := connections.MoveApiCall("move", moveName, baseURL) + if err != nil { + errorsChan <- fmt.Errorf("error fetching move %s: %v", moveName, err) + return + } + + capitalizedMove := cases.Title(language.English).String(strings.ReplaceAll(moveName, "-", " ")) + capitalizedType := cases.Title(language.English).String(moveStruct.Type.Name) + + movesChan <- MoveInfo{ + Accuracy: moveStruct.Accuracy, + Level: level, + Name: capitalizedMove, + Power: moveStruct.Power, + Type: capitalizedType, + } + }(pokeMove.Move.Name, detail.LevelLearnedAt) + } + } + + // Close channels when all goroutines are done + go func() { + wg.Wait() + close(movesChan) + close(errorsChan) + }() + + // Collect results from channels + movesOpen, errorsOpen := true, true + for movesOpen || errorsOpen { + select { + case move, ok := <-movesChan: + if !ok { + movesOpen = false continue } - - capitalizedMove := cases.Title(language.English).String(strings.ReplaceAll(moveName, "-", " ")) - capitalizedType := cases.Title(language.English).String(moveStruct.Type.Name) - - moves = append(moves, MoveInfo{ - Accuracy: moveStruct.Accuracy, - Level: detail.LevelLearnedAt, - Name: capitalizedMove, - Power: moveStruct.Power, - Type: capitalizedType, - }) + moves = append(moves, move) + case err, ok := <-errorsChan: + if !ok { + errorsOpen = false + continue + } + log.Println(err) } } if len(moves) == 0 { - _, err := fmt.Fprintln(w, "No level-up moves found for Scarlet & Violet.") - if err != nil { - return err - } + fmt.Fprintln(w, "No level-up moves found for Scarlet & Violet.") return nil }