isitup/
lib.rs

1use dyn_fmt::AsStrFormatExt;
2use lazy_static::lazy_static;
3use reqwest::blocking::Client;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Serialize, Deserialize)]
7struct IsItUpResponse {
8    pub status_code: i8,
9}
10
11pub enum DomainStatus {
12    Up,
13    Down,
14    DoesNotExist,
15}
16
17const URL: &str = "https://isitup.org/{}.json";
18
19lazy_static! {
20    static ref CLIENT: Client = reqwest::blocking::Client::new();
21}
22
23/// Taps into the [isitup](https://isitup.org) API
24/// to check if a domain is up or down
25///
26/// ```
27/// let response = isitup::isitup("github.com".to_string());
28/// assert!(response.is_ok());
29/// ```
30pub fn isitup(domain: String) -> Result<DomainStatus, reqwest::Error> {
31    let isitup_response = CLIENT.get(URL.format(&[domain])).send()?;
32    if isitup_response.status().is_client_error() {
33        return Ok(DomainStatus::DoesNotExist);
34    }
35    match isitup_response.json::<IsItUpResponse>() {
36        Ok(valid_json) => {
37            if valid_json.status_code == 1 {
38                Ok(DomainStatus::Up)
39            } else {
40                Ok(DomainStatus::Down)
41            }
42        }
43        Err(invalid_json) => Err(invalid_json),
44    }
45}
46
47/// Check if [isitup](https://isitup.org) is accessible
48///
49/// ```
50/// let response = isitup::ping_isitup();
51/// assert!(response.is_ok());
52/// ```
53pub fn ping_isitup() -> Result<bool, reqwest::Error> {
54    Ok(CLIENT.get(&URL[..18]).send()?.status().is_success())
55}