This commit is contained in:
@@ -68,21 +68,67 @@ defmodule CobblemonUi.PokeApi do
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
defp fetch_types(species) do
|
||||
url = "https://pokeapi.co/api/v2/pokemon/#{species}"
|
||||
api_name = CobblemonUi.PokeApiNames.normalize(species)
|
||||
|
||||
case fetch_types_direct(api_name) do
|
||||
{:ok, types} ->
|
||||
types
|
||||
|
||||
:not_found ->
|
||||
# The /pokemon/ endpoint requires the specific form name (e.g.
|
||||
# "aegislash-shield"). Fall back through the /pokemon-species/
|
||||
# endpoint to resolve the default variety.
|
||||
fetch_types_via_species(api_name)
|
||||
end
|
||||
end
|
||||
|
||||
defp fetch_types_direct(api_name) do
|
||||
url = "https://pokeapi.co/api/v2/pokemon/#{api_name}"
|
||||
|
||||
case Req.get(url) do
|
||||
{:ok, %Req.Response{status: 200, body: %{"types" => types}}} ->
|
||||
types
|
||||
|> Enum.sort_by(fn t -> t["slot"] end)
|
||||
|> Enum.map(fn t -> get_in(t, ["type", "name"]) end)
|
||||
|> Enum.reject(&is_nil/1)
|
||||
parsed =
|
||||
types
|
||||
|> Enum.sort_by(fn t -> t["slot"] end)
|
||||
|> Enum.map(fn t -> get_in(t, ["type", "name"]) end)
|
||||
|> Enum.reject(&is_nil/1)
|
||||
|
||||
{:ok, parsed}
|
||||
|
||||
{:ok, %Req.Response{status: 404}} ->
|
||||
:not_found
|
||||
|
||||
{:ok, %Req.Response{status: status}} ->
|
||||
Logger.warning("[PokeApi] Type lookup failed for #{species}: HTTP #{status}")
|
||||
[]
|
||||
Logger.warning("[PokeApi] Type lookup failed for #{api_name}: HTTP #{status}")
|
||||
{:ok, []}
|
||||
|
||||
{:error, reason} ->
|
||||
Logger.warning("[PokeApi] Type lookup failed for #{species}: #{inspect(reason)}")
|
||||
Logger.warning("[PokeApi] Type lookup failed for #{api_name}: #{inspect(reason)}")
|
||||
{:ok, []}
|
||||
end
|
||||
end
|
||||
|
||||
defp fetch_types_via_species(api_name) do
|
||||
url = "https://pokeapi.co/api/v2/pokemon-species/#{api_name}"
|
||||
|
||||
with {:ok, %Req.Response{status: 200, body: body}} <- Req.get(url),
|
||||
%{"varieties" => varieties} <- body,
|
||||
%{"pokemon" => %{"url" => pokemon_url}} <-
|
||||
Enum.find(varieties, fn v -> v["is_default"] end) do
|
||||
case Req.get(pokemon_url) do
|
||||
{:ok, %Req.Response{status: 200, body: %{"types" => types}}} ->
|
||||
types
|
||||
|> Enum.sort_by(fn t -> t["slot"] end)
|
||||
|> Enum.map(fn t -> get_in(t, ["type", "name"]) end)
|
||||
|> Enum.reject(&is_nil/1)
|
||||
|
||||
_ ->
|
||||
Logger.warning("[PokeApi] Fallback type lookup failed for #{api_name}")
|
||||
[]
|
||||
end
|
||||
else
|
||||
_ ->
|
||||
Logger.warning("[PokeApi] Species fallback failed for #{api_name}")
|
||||
[]
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user