1use eyre::Result;
2use reqwest::{Client, RequestBuilder};
3use serde::de::DeserializeOwned;
4use serde::Serialize;
5
6use crate::utils::response::NadoRestResponse;
7
8#[derive(Clone)]
9pub struct RestClient {
10 client: Client,
11}
12
13impl Default for RestClient {
14 fn default() -> Self {
15 Self::new()
16 }
17}
18
19impl RestClient {
20 pub fn new() -> Self {
21 Self {
22 client: Client::new(),
23 }
24 }
25 pub async fn get_request<R: DeserializeOwned + Send>(&self, url: &str) -> Result<R> {
26 request(self.client.get(url)).await
27 }
28
29 pub async fn post_request<T: Serialize, R: DeserializeOwned + Send>(
30 &self,
31 url: &str,
32 payload: &T,
33 ) -> Result<R> {
34 request(self.client.post(url).json(payload)).await
35 }
36
37 pub async fn debug_request<T: Serialize>(&self, url: &str, payload: &T) -> Result<()> {
38 debug_request(self.client.post(url).json(payload)).await
39 }
40}
41
42async fn request<R: DeserializeOwned + Send>(request: RequestBuilder) -> Result<R> {
43 let response = request.send().await?;
44 let response_data: NadoRestResponse<R> = response.json().await?;
45 response_data.extract_response()
46}
47
48async fn debug_request(request: RequestBuilder) -> Result<()> {
49 let response = request.send().await?;
50 let response_data = response.text().await?;
51 println!("response_data: {response_data}");
52 Ok(())
53}