checkhost 0.1.0

A CLI and API Wrapper for https://check-host.net
Documentation
use std::{collections::HashMap, thread, time::Duration};

use serde::Deserialize;
use serde_json::Value;

mod utils;

#[allow(dead_code)]
#[derive(Debug, Deserialize)]
struct CheckRequestResponse {
    nodes: HashMap<String, Vec<String>>,
    ok: u8,
    permanent_link: String,
    request_id: String,
}

fn sleep(time: u8) {
    thread::sleep(Duration::from_secs(time.into()));
}

pub fn check_http(
    host: &str,
    nodes: u8,
    wait: u8,
) -> Result<HashMap<String, Option<Vec<Vec<Value>>>>, reqwest::Error> {
    let url = utils::check_url_builder(host, nodes, "http");
    let init_check = utils::api_request::<CheckRequestResponse>(url.as_str())?;

    sleep(wait);

    let result_url = utils::result_url_builder(&init_check.request_id);
    let check_result =
        utils::api_request::<HashMap<String, Option<Vec<Vec<Value>>>>>(result_url.as_str())?;

    Ok(check_result)
}

pub fn check_ping(
    host: &str,
    nodes: u8,
    wait: u8,
) -> Result<HashMap<String, Option<Vec<Vec<Vec<Value>>>>>, reqwest::Error> {
    let url = utils::check_url_builder(host, nodes, "ping");
    let init_check = utils::api_request::<CheckRequestResponse>(url.as_str())?;

    sleep(wait);

    let result_url = utils::result_url_builder(&init_check.request_id);
    let check_result =
        utils::api_request::<HashMap<String, Option<Vec<Vec<Vec<Value>>>>>>(result_url.as_str())?;

    Ok(check_result)
}

#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub enum TcpCheckResponse {
    Ok { address: String, time: f64 },
    Err { error: String },
}

pub fn check_tcp(
    host: &str,
    nodes: u8,
    wait: u8,
) -> Result<HashMap<String, Option<Vec<TcpCheckResponse>>>, reqwest::Error> {
    let url = utils::check_url_builder(host, nodes, "tcp");
    let init_check = utils::api_request::<CheckRequestResponse>(url.as_str())?;

    sleep(wait);

    let result_url = utils::result_url_builder(&init_check.request_id);
    let check_result = utils::api_request(result_url.as_str())?;

    Ok(check_result)
}

#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub enum UdpCheckResponse {
    Ok { address: String, timeout: u8 },
    Err { error: String },
}

pub fn check_udp(
    host: &str,
    nodes: u8,
    wait: u8,
) -> Result<HashMap<String, Option<Vec<UdpCheckResponse>>>, reqwest::Error> {
    let url = utils::check_url_builder(host, nodes, "udp");
    let init_check = utils::api_request::<CheckRequestResponse>(url.as_str())?;

    sleep(wait);

    let result_url = utils::result_url_builder(&init_check.request_id);
    let check_result = utils::api_request(result_url.as_str())?;

    Ok(check_result)
}

#[allow(dead_code)]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
pub struct DnsResponse {
    pub a: Vec<String>,
    pub aaaa: Vec<String>,
    pub ttl: Option<u64>,
}

pub fn check_dns(
    host: &str,
    nodes: u8,
    wait: u8,
) -> Result<HashMap<String, Option<Vec<DnsResponse>>>, reqwest::Error> {
    let url = utils::check_url_builder(host, nodes, "dns");
    let init_check = utils::api_request::<CheckRequestResponse>(url.as_str())?;

    sleep(wait);

    let result_url = utils::result_url_builder(&init_check.request_id);
    let check_result = utils::api_request(result_url.as_str())?;

    Ok(check_result)
}