use std::convert::TryFrom;
use rusoto_dynamodb::{DeleteItemError, DeleteItemInput};
use crate::{key, AttributeError, Attributes, DynamoDb, DynamoError, Table};
pub trait Delete<'d, D: 'd + ?Sized>: Table {
type Builder;
fn delete(client: &'d D) -> Self::Builder;
}
impl<'d, D: 'd + ?Sized, K: key::Builder<'d, D, DeleteItemInput>> Delete<'d, D> for K {
type Builder = K::Builder;
fn delete(client: &'d D) -> Self::Builder {
K::key(client)
}
}
impl From<key::Key> for DeleteItemInput {
fn from(k: key::Key) -> Self {
let key::Key { table_name, key } = k;
Self { key, table_name, ..Self::default() }
}
}
impl<'d, D: 'd + ?Sized, T> key::Expr<'d, D, DeleteItemInput, T>
where
D: DynamoDb,
&'d D: Send,
T: Send,
{
pub async fn execute(self) -> Result<(), DynamoError<DeleteItemError>> {
let Self { client, input, _phantom } = self;
client.delete_item(input).await?;
Ok(())
}
}
impl<'d, D: 'd + ?Sized, T> key::Expr<'d, D, DeleteItemInput, T> {
#[must_use]
pub fn return_all_old(self) -> key::Expr<'d, D, ReturnAllOld, T> {
let Self { client, mut input, _phantom } = self;
input.return_values = Some("ALL_OLD".to_string());
key::Expr {
client,
input: ReturnAllOld { input },
_phantom,
}
}
}
pub struct ReturnAllOld {
input: DeleteItemInput,
}
impl<'d, D: 'd + ?Sized, T> key::Expr<'d, D, ReturnAllOld, T>
where
D: DynamoDb,
&'d D: Send,
T: TryFrom<Attributes, Error = AttributeError> + Send,
{
pub async fn execute(self) -> Result<T, DynamoError<DeleteItemError>> {
let Self { client, input, _phantom } = self;
let output = client.delete_item(input.input).await?;
let item = output.attributes.ok_or(AttributeError::MissingAttributes)?;
Ok(T::try_from(item)?)
}
}