Skip to main content

maestro_http/
lib.rs

1use reqwest::header::{HeaderMap, HeaderName, HeaderValue};
2use reqwest::Client;
3use serde::Serialize;
4use std::time::Duration;
5
6pub struct HttpClient {
7    client: Client,
8    url: String,
9    headers: HeaderMap,
10    timeout: Option<u64>,
11}
12
13impl HttpClient {
14    pub fn new(url: &str) -> Self {
15        Self {
16            client: Client::new(),
17            url: url.to_string(),
18            headers: HeaderMap::new(),
19            timeout: None,
20        }
21    }
22
23    pub fn header(mut self, key: &str, value: &str) -> Self {
24    let name = HeaderName::from_bytes(key.as_bytes()).unwrap();
25    let val = HeaderValue::from_str(value).unwrap();
26
27    self.headers.insert(name, val);
28    self
29}
30
31    pub fn timeout(mut self, secs: u64) -> Self {
32        self.timeout = Some(secs);
33        self
34    }
35
36    pub async fn text(self) -> Result<String, reqwest::Error> {
37        let mut req = self.client.get(&self.url).headers(self.headers);
38
39        if let Some(t) = self.timeout {
40            req = req.timeout(Duration::from_secs(t));
41        }
42
43        let res = req.send().await?;
44        res.text().await
45    }
46
47    pub async fn json<T: Serialize>(self, body: &T) -> Result<String, reqwest::Error> {
48        let mut req = self.client.post(&self.url).headers(self.headers);
49
50        if let Some(t) = self.timeout {
51            req = req.timeout(Duration::from_secs(t));
52        }
53
54        let res = req.json(body).send().await?;
55        res.text().await
56    }
57
58    pub async fn fetch_json<T: serde::de::DeserializeOwned>(
59        self
60    ) -> Result<T, reqwest::Error> {
61        let mut req = self.client.get(&self.url).headers(self.headers);
62
63        if let Some(t) = self.timeout {
64            req = req.timeout(Duration::from_secs(t));
65        }
66
67        let res = req.send().await?;
68        res.json::<T>().await
69    }
70}
71
72pub fn get(url: &str) -> HttpClient {
73    HttpClient::new(url)
74}
75
76pub fn post(url: &str) -> HttpClient {
77    HttpClient::new(url)
78}