pokeapi_client/
lib.rs

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/*
34
35pub fn get_all_pokemon() -> Result<NamedAPIResourceList, reqwest::Error> {
36    let response = reqwest::blocking::get(format!("{}/{}?limit=3000", BASE, POKEMON))?;
37    response.json()
38}
39 */
40
41#[cfg(test)]
42mod test {
43
44    use super::*;
45
46    /*
47    use crate::pokemon::models::pokemon::PokemonResponse;
48
49    pub fn serde_error_peek(json: &str) {
50        let text = &json[15500..15650];
51        println!("{}", text);
52    }
53
54    #[tokio::test]
55    async fn testing_broken_pokemon() {
56        let response = reqwest::get(format!("{}/pokemon/{}", BASE, &1011))
57            .await
58            .unwrap();
59        let text: PokemonResponse = response.json().await.unwrap();
60        //serde_error_peek(response.text().await.unwrap().as_ref());
61    } */
62
63    #[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    /*  #[tokio::test]
92    async fn searching_for_breaking_pokemon() {
93        for i_u16 in 1_011..=1_200 {
94            println!("catching {}...", i_u16);
95            let response = get_pokemon(i_u16).await;
96            assert!(response.is_ok(), "no {} failed", i_u16);
97        }
98    } */
99}