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}