use reqwest::{self};
use serde::{Deserialize, Serialize};
use std::marker::PhantomData;
use uuid::Uuid;
use crate::queries::filterable_types::Filterable;
use super::traits::DataProvider;
#[derive(Clone)]
pub struct RestApiDataProvider<T>
where
T: Serialize + for<'d> Deserialize<'d>,
{
endpoint: String,
http_client: reqwest::Client,
_t: PhantomData<T>,
}
impl<T> RestApiDataProvider<T>
where
T: Serialize + for<'d> Deserialize<'d>,
{
pub fn from_endpoint(url: String) -> Self {
let client = reqwest::Client::new();
Self {
endpoint: url,
http_client: client,
_t: PhantomData,
}
}
}
pub trait Id {
fn id(&self) -> &Uuid;
}
impl<T> DataProvider<T> for RestApiDataProvider<T>
where
T: Serialize + for<'d> Deserialize<'d> + Id + Default + Clone + Send + Sync + Filterable,
{
type CreateRequest = T;
type Error = crate::Error;
async fn all(&self) -> Result<impl Iterator<Item = T>, Self::Error> {
Ok(self
.http_client
.get(&self.endpoint)
.send()
.await
.unwrap()
.json::<Vec<T>>()
.await
.unwrap()
.into_iter())
}
async fn get(
&self,
_predicate: impl Fn(T::FilterType) -> crate::queries::Filter,
) -> Result<Option<T>, Self::Error> {
todo!()
}
async fn create(
&self,
item: Self::CreateRequest,
) -> Result<T, Self::Error> {
let _response = self.http_client.post(&self.endpoint).json(&item).send().await?;
Ok(item)
}
async fn delete(
&self,
item: T,
) -> Result<(), Self::Error> {
let url = &self.endpoint;
let _response = self.http_client.delete(url).json(&item).send().await.unwrap();
Ok(())
}
async fn update(
&self,
item: &T,
) -> Result<(), Self::Error> {
let url = &self.endpoint;
let _response = self.http_client.patch(url).json(item).send().await.unwrap();
Ok(())
}
}