@@ -20,6 +20,7 @@ import (
2020 "sort"
2121 "strconv"
2222 "strings"
23+ "sync"
2324)
2425
2526func 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