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
23pub 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
47pub fn ping_isitup() -> Result<bool, reqwest::Error> {
54 Ok(CLIENT.get(&URL[..18]).send()?.status().is_success())
55}