pokeapi_types/
pokemon.rs

1use crate::NamedAPIResource;
2use serde::{Deserialize, Serialize};
3
4#[derive(Serialize, Deserialize, Debug)]
5pub struct PokemonType {
6    pub slot: u8,
7    pub r#type: NamedAPIResource,
8}
9
10#[derive(Serialize, Deserialize, Debug)]
11pub struct PokemonStat {
12    pub stat: NamedAPIResource,
13    pub effort: u32,
14    pub base_stat: u32,
15}
16
17#[derive(Serialize, Deserialize, Debug)]
18pub struct PokemonSprites {
19    pub front_default: Option<String>,
20    pub front_shiny: Option<String>,
21    pub front_female: Option<String>,
22    pub front_shiny_female: Option<String>,
23    pub back_default: Option<String>,
24    pub back_shiny: Option<String>,
25    pub back_female: Option<String>,
26    pub back_shiny_female: Option<String>,
27}
28
29#[derive(Serialize, Deserialize, Debug)]
30pub struct PokemonMoveVersion {
31    pub move_learn_method: NamedAPIResource,
32    pub version_group: NamedAPIResource,
33    pub level_learned_at: u32,
34}
35
36#[derive(Serialize, Deserialize, Debug)]
37pub struct PokemonMove {
38    pub r#move: NamedAPIResource,
39    pub version_group_details: Vec<PokemonMoveVersion>,
40}
41
42#[derive(Serialize, Deserialize, Debug)]
43pub struct PokemonHeldItemVersion {
44    pub version: NamedAPIResource,
45    pub rarity: u32,
46}
47
48#[derive(Serialize, Deserialize, Debug)]
49pub struct PokemonHeldItem {
50    pub item: NamedAPIResource,
51    pub version_details: Vec<PokemonHeldItemVersion>,
52}
53
54#[derive(Serialize, Deserialize, Debug)]
55pub struct VersionGameIndex {
56    pub game_index: u32,
57    pub version: NamedAPIResource,
58}
59
60#[derive(Serialize, Deserialize, Debug)]
61pub struct PokemonAbility {
62    pub ability: NamedAPIResource,
63    pub is_hidden: bool,
64    pub slot: u32,
65}
66
67/// This is the JSON struct for the endpoint /pokemon/{id}
68///
69/// # Examples
70///
71/// ```
72/// use pokeapi_types::Pokemon;
73///
74/// async fn getBulbasaur() {
75///     let response = reqwest::get("https://pokeapi.co/api/v2/pokemon/1/")
76///         .await
77///         .unwrap();
78///     let bulbasaur: Pokemon = response.json().await.unwrap();
79/// }
80/// ```
81#[derive(Serialize, Deserialize, Debug)]
82pub struct Pokemon {
83    pub abilities: Vec<PokemonAbility>,
84    pub base_experience: u32,
85    pub forms: Vec<NamedAPIResource>,
86    pub game_indices: Vec<VersionGameIndex>,
87    pub height: u32,
88    pub held_items: Vec<PokemonHeldItem>,
89    pub id: u32,
90    pub is_default: bool,
91    pub location_area_encounters: String,
92    pub moves: Vec<PokemonMove>,
93    pub name: String,
94    pub order: u32,
95    pub species: NamedAPIResource,
96    pub sprites: PokemonSprites,
97    pub stats: Vec<PokemonStat>,
98    pub types: Vec<PokemonType>,
99    pub weight: u32,
100}
101
102#[cfg(test)]
103mod tests {
104    use super::*;
105
106    #[tokio::test]
107    async fn should_serialize_to_pokemon() {
108        let response = reqwest::get("https://pokeapi.co/api/v2/pokemon/1/")
109            .await
110            .unwrap();
111        assert!(&response.status().is_success());
112        let pokemon: Pokemon = response.json().await.unwrap();
113        assert_eq!(pokemon.name, "bulbasaur");
114    }
115}