use crate::types::CreateEmailBaseOptions;
#[derive(Debug, Clone, serde::Serialize)]
pub struct Idempotent<T> {
#[serde(skip)]
pub(crate) idempotency_key: Option<String>,
#[serde(flatten)]
pub(crate) data: T,
}
macro_rules! idempotent_from {
($inner:ty) => {
impl From<$inner> for Idempotent<$inner> {
fn from(value: $inner) -> Self {
Self {
idempotency_key: None,
data: value,
}
}
}
};
}
idempotent_from!(CreateEmailBaseOptions);
idempotent_from!(Vec<CreateEmailBaseOptions>);
pub trait IdempotentTrait<T> {
fn with_idempotency_key(self, idempotency_key: &str) -> Idempotent<T>;
}
impl<T> IdempotentTrait<Self> for T
where
T: IntoIterator<Item = CreateEmailBaseOptions> + Send,
{
fn with_idempotency_key(self, idempotency_key: &str) -> Idempotent<Self> {
Idempotent {
idempotency_key: Some(idempotency_key.to_owned()),
data: self,
}
}
}