use crate::ai::Auth;
use crate::http::{HTTPResult, HTTPService as BaseHTTPService};
use reqwest::header;
use reqwest::{Client, IntoUrl};
use serde::Serialize;
use serde::de::DeserializeOwned;
pub trait APIService: BaseHTTPService {
fn post<U, D, R>(
&self,
uri: U,
auth: &Auth,
data: &D,
) -> impl Future<Output = HTTPResult<R>> + Send
where
U: IntoUrl + Send,
D: Serialize + Sync,
R: DeserializeOwned;
}
#[derive(Debug)]
pub struct HTTPService {
client: Client,
}
impl HTTPService {
pub fn new() -> Self {
let client = Self::client();
Self { client }
}
}
impl BaseHTTPService for HTTPService {}
impl APIService for HTTPService {
async fn post<U, D, R>(&self, uri: U, auth: &Auth, data: &D) -> HTTPResult<R>
where
U: IntoUrl + Send,
D: Serialize + Sync,
R: DeserializeOwned,
{
let auth_header = format!("Bearer {}", auth.api_key());
let json_object = self
.client
.post(uri)
.header(header::CONTENT_TYPE, "application/json")
.header(header::AUTHORIZATION, auth_header)
.json(data)
.send()
.await?
.json::<R>()
.await?;
Ok(json_object)
}
}