1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
extern crate anyhow;
extern crate reqwest;
extern crate serde_json;

const EP: &str = "https://api.isevenapi.xyz/api/iseven/";

#[allow(dead_code)]
#[derive(serde::Deserialize)]
struct IsEvenResult {
    ad: Option<String>,
    iseven: Option<bool>,
    error: Option<String>,
}

pub async fn is_even<T: std::fmt::Display>(n: T) -> anyhow::Result<bool> {
    let url = format!("{}{}", EP, n);
    let res = reqwest::get(url).await?.json::<IsEvenResult>().await?;

    if let Some(iseven) = res.iseven {
        Ok(iseven)
    } else if let Some(error) = res.error {
        Err(anyhow::anyhow!(error))
    } else {
        panic!("Unknown response from isEven api. Is it under maintainance?");
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        assert_eq!(is_even(1), false);
        assert_eq!(is_even(2), true);
        assert_eq!(is_even(42), true);
        assert_eq!(is_even(43), false);
    }
}