Skip to content

Commit e54611d

Browse files
adding concurrency to --move flag (#153)
1 parent e5a0b22 commit e54611d

File tree

1 file changed

+55
-19
lines changed

1 file changed

+55
-19
lines changed

flags/pokemonflagset.go

Lines changed: 55 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"sort"
2121
"strconv"
2222
"strings"
23+
"sync"
2324
)
2425

2526
func header(header string) string {
@@ -225,37 +226,72 @@ func MovesFlag(w io.Writer, endpoint string, pokemonName string) error {
225226

226227
var moves []MoveInfo
227228

229+
movesChan := make(chan MoveInfo)
230+
errorsChan := make(chan error)
231+
232+
var wg sync.WaitGroup
233+
234+
// Count eligible moves for concurrency
235+
eligibleMoves := 0
228236
for _, pokeMove := range pokemonStruct.Moves {
229237
for _, detail := range pokeMove.VersionGroupDetails {
230238
if detail.VersionGroup.Name != "scarlet-violet" || detail.MoveLearnedMethod.Name != "level-up" {
231239
continue
232240
}
233241

234-
moveName := pokeMove.Move.Name
235-
moveStruct, _, err := connections.MoveApiCall("move", moveName, baseURL)
236-
if err != nil {
237-
log.Printf("Error fetching move %s: %v", moveName, err)
242+
eligibleMoves++
243+
wg.Add(1)
244+
go func(moveName string, level int) {
245+
defer wg.Done()
246+
247+
moveStruct, _, err := connections.MoveApiCall("move", moveName, baseURL)
248+
if err != nil {
249+
errorsChan <- fmt.Errorf("error fetching move %s: %v", moveName, err)
250+
return
251+
}
252+
253+
capitalizedMove := cases.Title(language.English).String(strings.ReplaceAll(moveName, "-", " "))
254+
capitalizedType := cases.Title(language.English).String(moveStruct.Type.Name)
255+
256+
movesChan <- MoveInfo{
257+
Accuracy: moveStruct.Accuracy,
258+
Level: level,
259+
Name: capitalizedMove,
260+
Power: moveStruct.Power,
261+
Type: capitalizedType,
262+
}
263+
}(pokeMove.Move.Name, detail.LevelLearnedAt)
264+
}
265+
}
266+
267+
// Close channels when all goroutines are done
268+
go func() {
269+
wg.Wait()
270+
close(movesChan)
271+
close(errorsChan)
272+
}()
273+
274+
// Collect results from channels
275+
movesOpen, errorsOpen := true, true
276+
for movesOpen || errorsOpen {
277+
select {
278+
case move, ok := <-movesChan:
279+
if !ok {
280+
movesOpen = false
238281
continue
239282
}
240-
241-
capitalizedMove := cases.Title(language.English).String(strings.ReplaceAll(moveName, "-", " "))
242-
capitalizedType := cases.Title(language.English).String(moveStruct.Type.Name)
243-
244-
moves = append(moves, MoveInfo{
245-
Accuracy: moveStruct.Accuracy,
246-
Level: detail.LevelLearnedAt,
247-
Name: capitalizedMove,
248-
Power: moveStruct.Power,
249-
Type: capitalizedType,
250-
})
283+
moves = append(moves, move)
284+
case err, ok := <-errorsChan:
285+
if !ok {
286+
errorsOpen = false
287+
continue
288+
}
289+
log.Println(err)
251290
}
252291
}
253292

254293
if len(moves) == 0 {
255-
_, err := fmt.Fprintln(w, "No level-up moves found for Scarlet & Violet.")
256-
if err != nil {
257-
return err
258-
}
294+
fmt.Fprintln(w, "No level-up moves found for Scarlet & Violet.")
259295
return nil
260296
}
261297

0 commit comments

Comments
 (0)