use std::marker::PhantomData;
use reqwest::Method;
use serde::de::DeserializeOwned;
use serde::Serialize;
use crate::error::Result;
use crate::transport::Transport;
use crate::types::DimeSchedulerApiResponse;
#[derive(Clone)]
pub struct CrudApi<E, D> {
transport: Transport,
route: &'static str,
_marker: PhantomData<fn() -> (E, D)>,
}
impl<E: Serialize, D: DeserializeOwned> CrudApi<E, D> {
pub(crate) fn new(transport: Transport, route: &'static str) -> Self {
Self {
transport,
route,
_marker: PhantomData,
}
}
pub async fn create(&self, entity: &E) -> Result<DimeSchedulerApiResponse> {
self.transport
.send_json(Method::POST, self.route, entity)
.await
}
pub async fn create_many(&self, entities: &[E]) -> Result<DimeSchedulerApiResponse> {
self.transport
.send_json(Method::POST, self.route, entities)
.await
}
pub async fn update(&self, entity: &E) -> Result<DimeSchedulerApiResponse> {
self.transport
.send_json(Method::PUT, self.route, entity)
.await
}
pub async fn update_many(&self, entities: &[E]) -> Result<DimeSchedulerApiResponse> {
self.transport
.send_json(Method::PUT, self.route, entities)
.await
}
pub async fn delete(&self, entity: &E) -> Result<DimeSchedulerApiResponse> {
self.transport
.send_json(Method::DELETE, self.route, entity)
.await
}
pub async fn delete_many(&self, entities: &[E]) -> Result<DimeSchedulerApiResponse> {
self.transport
.send_json(Method::DELETE, self.route, entities)
.await
}
pub async fn get_all(&self) -> Result<Vec<D>> {
self.transport.get_json(self.route, &[]).await
}
pub fn route(&self) -> &'static str {
self.route
}
pub(crate) fn transport(&self) -> &Transport {
&self.transport
}
}