summaryrefslogtreecommitdiffstats
path: root/src/service/http.rs
blob: fb3ff131d8cb372bdd6e9e1bb869a0014f86c348 (plain)
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
40
41
42
43
44
45
46
use std::fmt::Display;

use serde::Deserialize;

use crate::{Error, Status};

#[derive(Debug, Clone, Deserialize)]
pub struct Http {
    pub url: String,
    #[serde(default = "Http::default_method")]
    pub method: String,
    #[serde(default = "Http::default_code")]
    pub status_code: u16,
}

impl Http {
    fn default_method() -> String {
        "GET".to_string()
    }

    fn default_code() -> u16 {
        200
    }
}

impl Display for Http {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{} {}", self.method, self.url)
    }
}

impl Http {
    pub async fn check(&self, client: reqwest::Client) -> Result<Status, Error> {
        let status_code = client
            .request(self.method.parse().map_err(|_| Error::Method)?, &self.url)
            .send()
            .await?
            .status()
            .as_u16();

        match status_code == self.status_code {
            true => Ok(Status::Pass),
            false => Ok(Status::Fail(Some(format!("Status code: {status_code}")))),
        }
    }
}