use ajars_core::{HttpMethod, Rest};
use crate::reqwest::Client;
use serde::{de::DeserializeOwned, Serialize};
pub mod reqwest {
pub use reqwest::*;
}
#[derive(Clone)]
pub struct RestReqwest {
client: Client,
base_url: String,
}
impl RestReqwest {
pub fn new(client: Client, base_url: String) -> Self {
Self { client, base_url }
}
pub async fn submit<I: Serialize + DeserializeOwned, O: Serialize + DeserializeOwned, REST: Rest<I, O>>(
&self,
rest: &REST,
data: &I,
) -> Result<O, reqwest::Error> {
let url = format!("{}{}", &self.base_url, rest.path());
let request = match rest.method() {
HttpMethod::DELETE => self.client.delete(&url).query(data),
HttpMethod::GET => self.client.get(&url).query(data),
HttpMethod::POST => self.client
.post(&url)
.header("Content-Type", "application/json")
.json(data),
HttpMethod::PUT => self.client
.put(&url)
.header("Content-Type", "application/json")
.json(data),
};
request.send().await?.json().await
}
}