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#[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}