2022-12-30 08:23:19 +00:00
|
|
|
use crate::api::conn::Method;
|
|
|
|
use crate::api::conn::Param;
|
|
|
|
use crate::api::conn::Router;
|
|
|
|
use crate::api::opt::Range;
|
|
|
|
use crate::api::opt::Resource;
|
|
|
|
use crate::api::Connection;
|
|
|
|
use crate::api::Result;
|
|
|
|
use crate::sql::Id;
|
2023-03-31 22:49:29 +00:00
|
|
|
use serde::de::DeserializeOwned;
|
2022-12-30 08:23:19 +00:00
|
|
|
use std::future::Future;
|
|
|
|
use std::future::IntoFuture;
|
|
|
|
use std::marker::PhantomData;
|
|
|
|
use std::pin::Pin;
|
|
|
|
|
|
|
|
/// A record delete future
|
|
|
|
#[derive(Debug)]
|
2023-04-19 08:26:22 +00:00
|
|
|
#[must_use = "futures do nothing unless you `.await` or poll them"]
|
2022-12-30 08:23:19 +00:00
|
|
|
pub struct Delete<'r, C: Connection, R> {
|
|
|
|
pub(super) router: Result<&'r Router<C>>,
|
|
|
|
pub(super) resource: Result<Resource>,
|
|
|
|
pub(super) range: Option<Range<Id>>,
|
|
|
|
pub(super) response_type: PhantomData<R>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'r, Client, R> Delete<'r, Client, R>
|
|
|
|
where
|
|
|
|
Client: Connection,
|
|
|
|
{
|
2023-03-31 22:49:29 +00:00
|
|
|
async fn execute<T>(self) -> Result<T>
|
|
|
|
where
|
|
|
|
T: DeserializeOwned,
|
|
|
|
{
|
2022-12-30 08:23:19 +00:00
|
|
|
let resource = self.resource?;
|
|
|
|
let param = match self.range {
|
|
|
|
Some(range) => resource.with_range(range)?,
|
|
|
|
None => resource.into(),
|
|
|
|
};
|
|
|
|
let mut conn = Client::new(Method::Delete);
|
|
|
|
conn.execute(self.router?, Param::new(vec![param])).await
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-31 22:49:29 +00:00
|
|
|
impl<'r, Client, R> IntoFuture for Delete<'r, Client, Option<R>>
|
2022-12-30 08:23:19 +00:00
|
|
|
where
|
|
|
|
Client: Connection,
|
2023-03-31 22:49:29 +00:00
|
|
|
R: DeserializeOwned + Send + Sync + 'r,
|
2022-12-30 08:23:19 +00:00
|
|
|
{
|
2023-03-31 22:49:29 +00:00
|
|
|
type Output = Result<R>;
|
2022-12-30 08:23:19 +00:00
|
|
|
type IntoFuture = Pin<Box<dyn Future<Output = Self::Output> + Send + Sync + 'r>>;
|
|
|
|
|
|
|
|
fn into_future(self) -> Self::IntoFuture {
|
|
|
|
Box::pin(self.execute())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-31 22:49:29 +00:00
|
|
|
impl<'r, Client, R> IntoFuture for Delete<'r, Client, Vec<R>>
|
2022-12-30 08:23:19 +00:00
|
|
|
where
|
|
|
|
Client: Connection,
|
2023-03-31 22:49:29 +00:00
|
|
|
R: DeserializeOwned + Send + Sync + 'r,
|
2022-12-30 08:23:19 +00:00
|
|
|
{
|
2023-03-31 22:49:29 +00:00
|
|
|
type Output = Result<Vec<R>>;
|
2022-12-30 08:23:19 +00:00
|
|
|
type IntoFuture = Pin<Box<dyn Future<Output = Self::Output> + Send + Sync + 'r>>;
|
|
|
|
|
|
|
|
fn into_future(self) -> Self::IntoFuture {
|
|
|
|
Box::pin(self.execute())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-31 22:49:29 +00:00
|
|
|
impl<C, R> Delete<'_, C, Vec<R>>
|
2022-12-30 08:23:19 +00:00
|
|
|
where
|
|
|
|
C: Connection,
|
|
|
|
{
|
|
|
|
/// Restricts a range of records to delete
|
|
|
|
pub fn range(mut self, bounds: impl Into<Range<Id>>) -> Self {
|
|
|
|
self.range = Some(bounds.into());
|
|
|
|
self
|
|
|
|
}
|
|
|
|
}
|