Add Go-based PokeAPI fetch tool
Replaces the Python fetch_pokeapi.py script with a Go tool that crawls a local PokeAPI instance and writes seed JSON files. Supports caching and special encounter definitions via JSON config. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
110
tools/fetch-pokeapi/types.go
Normal file
110
tools/fetch-pokeapi/types.go
Normal file
@@ -0,0 +1,110 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// NamedRef is a PokeAPI named resource reference (name + URL).
|
||||
type NamedRef struct {
|
||||
Name string `json:"name"`
|
||||
URL string `json:"url"`
|
||||
}
|
||||
|
||||
// ID extracts the trailing integer ID from the URL path.
|
||||
// e.g. "https://pokeapi.co/api/v2/pokemon/25/" -> 25
|
||||
func (r NamedRef) ID() int {
|
||||
s := strings.TrimRight(r.URL, "/")
|
||||
parts := strings.Split(s, "/")
|
||||
id, _ := strconv.Atoi(parts[len(parts)-1])
|
||||
return id
|
||||
}
|
||||
|
||||
// ---- PokeAPI response structs (only fields we use) ----
|
||||
|
||||
type SpeciesListResp struct {
|
||||
Results []NamedRef `json:"results"`
|
||||
}
|
||||
|
||||
type RegionResp struct {
|
||||
Locations []NamedRef `json:"locations"`
|
||||
}
|
||||
|
||||
type LocationResp struct {
|
||||
Areas []NamedRef `json:"areas"`
|
||||
}
|
||||
|
||||
type LocationAreaResp struct {
|
||||
PokemonEncounters []PokemonEncounter `json:"pokemon_encounters"`
|
||||
}
|
||||
|
||||
type PokemonEncounter struct {
|
||||
Pokemon NamedRef `json:"pokemon"`
|
||||
VersionDetails []VersionDetail `json:"version_details"`
|
||||
}
|
||||
|
||||
type VersionDetail struct {
|
||||
Version NamedRef `json:"version"`
|
||||
EncounterDetails []EncounterDetail `json:"encounter_details"`
|
||||
}
|
||||
|
||||
type EncounterDetail struct {
|
||||
Chance int `json:"chance"`
|
||||
Method NamedRef `json:"method"`
|
||||
MinLevel int `json:"min_level"`
|
||||
MaxLevel int `json:"max_level"`
|
||||
}
|
||||
|
||||
type SpeciesResp struct {
|
||||
ID int `json:"id"`
|
||||
Name string `json:"name"`
|
||||
EvolutionChain NamedRef `json:"evolution_chain"`
|
||||
Varieties []struct {
|
||||
IsDefault bool `json:"is_default"`
|
||||
Pokemon NamedRef `json:"pokemon"`
|
||||
} `json:"varieties"`
|
||||
}
|
||||
|
||||
type PokemonResp struct {
|
||||
ID int `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Species NamedRef `json:"species"`
|
||||
Types []struct {
|
||||
Slot int `json:"slot"`
|
||||
Type struct {
|
||||
Name string `json:"name"`
|
||||
} `json:"type"`
|
||||
} `json:"types"`
|
||||
}
|
||||
|
||||
type EvolutionChainResp struct {
|
||||
ID int `json:"id"`
|
||||
Chain ChainLink `json:"chain"`
|
||||
}
|
||||
|
||||
type ChainLink struct {
|
||||
Species NamedRef `json:"species"`
|
||||
EvolvesTo []ChainLink `json:"evolves_to"`
|
||||
EvolutionDetails []EvolutionDetail `json:"evolution_details"`
|
||||
}
|
||||
|
||||
type EvolutionDetail struct {
|
||||
Trigger NamedRef `json:"trigger"`
|
||||
MinLevel *int `json:"min_level"`
|
||||
Item *NamedRef `json:"item"`
|
||||
HeldItem *NamedRef `json:"held_item"`
|
||||
MinHappiness *int `json:"min_happiness"`
|
||||
MinAffection *int `json:"min_affection"`
|
||||
MinBeauty *int `json:"min_beauty"`
|
||||
TimeOfDay string `json:"time_of_day"`
|
||||
KnownMove *NamedRef `json:"known_move"`
|
||||
KnownMoveType *NamedRef `json:"known_move_type"`
|
||||
Location *NamedRef `json:"location"`
|
||||
PartySpecies *NamedRef `json:"party_species"`
|
||||
PartyType *NamedRef `json:"party_type"`
|
||||
Gender *int `json:"gender"`
|
||||
NeedsOverworldRain bool `json:"needs_overworld_rain"`
|
||||
TurnUpsideDown bool `json:"turn_upside_down"`
|
||||
TradeSpecies *NamedRef `json:"trade_species"`
|
||||
RelativePhysicalStats *int `json:"relative_physical_stats"`
|
||||
}
|
||||
Reference in New Issue
Block a user