krabdex 0.1.0

A type-safe, async Rust SDK for the PokeAPI
Documentation
use serde::{Deserialize, Serialize};
use serde_json::Value;

use crate::models::common::{NamedApiResource, VersionGameIndex};

/// PokeAPI Pokémon resource.
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct Pokemon {
    pub id: u32,
    pub name: String,
    pub base_experience: Option<u32>,
    pub height: u32,
    pub weight: u32,
    pub is_default: bool,
    pub order: u32,

    pub abilities: Vec<PokemonAbility>,
    pub forms: Vec<NamedApiResource>,
    pub game_indices: Vec<VersionGameIndex>,
    pub held_items: Vec<HeldItem>,
    pub location_area_encounters: String,
    pub moves: Vec<PokemonMove>,
    pub species: NamedApiResource,
    pub stats: Vec<PokemonStat>,
    pub types: Vec<PokemonTypeSlot>,

    #[serde(default)]
    pub past_types: Vec<PastType>,

    #[serde(default)]
    pub past_abilities: Vec<PastAbility>,

    /// Explicitly acknowledged but not modeled.
    /// This preserves the full payload without schema explosion.
    pub sprites: Value,

    #[serde(default)]
    pub cries: Option<PokemonCries>,
}

/* ---------- Abilities ---------- */

/// Ability info attached to a Pokémon.
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct PokemonAbility {
    pub is_hidden: bool,
    pub slot: u8,
    pub ability: Option<NamedApiResource>,
}

/* ---------- Held Items ---------- */

/// Held item details.
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct HeldItem {
    pub item: NamedApiResource,
    pub version_details: Vec<HeldItemVersionDetail>,
}

/// Held item details per version.
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct HeldItemVersionDetail {
    pub rarity: u32,
    pub version: NamedApiResource,
}

/* ---------- Moves ---------- */

/// Move entry on a Pokémon.
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct PokemonMove {
    #[serde(rename = "move")]
    pub move_: NamedApiResource,
    pub version_group_details: Vec<MoveVersionGroupDetail>,
}

/// Move details per version group.
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct MoveVersionGroupDetail {
    pub level_learned_at: u32,
    pub move_learn_method: NamedApiResource,
    pub version_group: NamedApiResource,
}

/* ---------- Stats ---------- */

/// Stat entry for a Pokémon.
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct PokemonStat {
    pub base_stat: u32,
    pub effort: u32,
    pub stat: NamedApiResource,
}

/* ---------- Types ---------- */

/// Type slot info (includes slot number).
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct PokemonTypeSlot {
    pub slot: u8,

    #[serde(rename = "type")]
    pub ty: NamedApiResource,
}

/* ---------- Past Types ---------- */

/// Historical type assignments for a Pokémon.
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct PastType {
    pub generation: NamedApiResource,
    pub types: Vec<PokemonTypeSlot>,
}

/* ---------- Past Abilities ---------- */

/// Historical ability assignments for a Pokémon.
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct PastAbility {
    pub generation: NamedApiResource,
    pub abilities: Vec<PokemonAbility>,
}

/* ---------- Cries (newer field) ---------- */

/// Pokémon cries (latest and legacy).
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct PokemonCries {
    pub latest: String,
    #[serde(default)]
    pub legacy: Option<String>,
}