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; use serde::de::DeserializeOwned; use std::future::Future; use std::future::IntoFuture; use std::marker::PhantomData; use std::pin::Pin; /// A record delete future #[derive(Debug)] #[must_use = "futures do nothing unless you `.await` or poll them"] pub struct Delete<'r, C: Connection, R> { pub(super) router: Result<&'r Router>, pub(super) resource: Result, pub(super) range: Option>, pub(super) response_type: PhantomData, } macro_rules! into_future { () => { fn into_future(self) -> Self::IntoFuture { let Delete { router, resource, range, .. } = self; Box::pin(async { let param = match range { Some(range) => resource?.with_range(range)?, None => resource?.into(), }; let mut conn = Client::new(Method::Delete); conn.execute(router?, Param::new(vec![param])).await }) } }; } impl<'r, Client, R> IntoFuture for Delete<'r, Client, Option> where Client: Connection, R: DeserializeOwned, { type Output = Result; type IntoFuture = Pin + Send + Sync + 'r>>; into_future! {} } impl<'r, Client, R> IntoFuture for Delete<'r, Client, Vec> where Client: Connection, R: DeserializeOwned, { type Output = Result>; type IntoFuture = Pin + Send + Sync + 'r>>; into_future! {} } impl Delete<'_, C, Vec> where C: Connection, { /// Restricts a range of records to delete pub fn range(mut self, bounds: impl Into>) -> Self { self.range = Some(bounds.into()); self } }