1use serde::{Deserialize, Serialize};
2
3pub mod characteristic;
4pub mod pokemon;
5pub mod species;
6
7#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
8#[serde(rename_all = "camelCase")]
9pub struct Resource {
10 pub name: String,
11 pub url: String,
12}
13
14const BASE: &str = "https://pokeapi.co/api/v2/";
15
16pub async fn get_pokemon(no: u16) -> Result<pokemon::PokemonResponse, reqwest::Error> {
17 let response = reqwest::get(format!("{}/pokemon/{}", BASE, &no)).await?;
18 response.json().await
19}
20
21pub async fn get_species(no: u16) -> Result<species::SpeciesResponse, reqwest::Error> {
22 let response = reqwest::get(format!("{}/pokemon-species/{}", BASE, &no)).await?;
23 response.json().await
24}
25
26pub async fn get_characteristic(
27 no: u16,
28) -> Result<characteristic::CharacteristicResponse, reqwest::Error> {
29 let response = reqwest::get(format!("{}/characteristic/{}", BASE, &no)).await?;
30 response.json().await
31}
32
33#[cfg(test)]
42mod test {
43
44 use super::*;
45
46 #[tokio::test]
64 async fn edge_case_pokemon_works() {
65 let response = get_pokemon(704).await;
66 assert!(response.is_ok());
67
68 let response = get_pokemon(657).await;
69 assert!(response.is_ok());
70
71 let response = get_pokemon(899).await;
72 assert!(response.is_ok());
73 let response = get_species(899).await;
74 assert!(response.is_ok());
75
76 let response = get_pokemon(1011).await;
77 assert!(response.is_ok());
78 let response = get_species(1011).await;
79 assert!(response.is_ok());
80 }
81
82 #[tokio::test]
83 async fn pokemon_check_bounds() {
84 let response = get_pokemon(0).await;
85 assert!(response.is_err());
86
87 let response = get_pokemon(1018).await;
88 assert!(response.is_err());
89 }
90
91 }