1use reqwest::{Client, Method};
2
3use super::client::{Headers, HttpClient, Query};
4
5#[derive(Debug, Clone)]
7pub struct ReqwestClient {
8 client: Client
9}
10
11#[derive(Debug)]
13pub enum ReqwestError {
14 Client(reqwest::Error),
15 StatusCode(reqwest::Response),
16}
17
18impl Default for ReqwestClient {
20 fn default() -> Self {
21 let client = reqwest::ClientBuilder::new()
22 .build()
23 .unwrap();
24 Self { client }
25 }
26}
27
28impl From<reqwest::Error> for ReqwestError {
30 fn from(value: reqwest::Error) -> Self {
31 ReqwestError::Client(value)
32 }
33}
34
35impl ReqwestClient {
38
39 #[inline]
42 async fn request(
43 &self,
44 payload: &Query,
45 headers: &Headers,
46 url: String,
47 method: Method
48 ) -> Result<String, ReqwestError> {
49 let mut request = self.client.request(method, url);
50 request = request
51 .query(payload)
52 .headers(headers.try_into().unwrap()) .header("Content-Type", "application/json");
56
57 let response = request.send().await?;
58
59 Ok(response.text().await?)
60 }
61}
62
63impl HttpClient for ReqwestClient {
65 type Error = ReqwestError;
77
78 #[inline]
81 async fn get(
82 &self,
83 url: String,
84 headers: &Headers,
85 payload: &Query,
86 ) -> Result<String, Self::Error> {
87 self.request(payload, headers, url, Method::GET).await
88 }
89
90 #[inline]
93 async fn post(
94 &self,
95 url: String,
96 headers: &Headers,
97 payload: &Query,
98 ) -> Result<String, Self::Error> {
99 self.request(payload, headers, url, Method::POST).await
100 }
101}
102