use std::{future::Future, pin::Pin};
use tracing::debug;
use crate::EmailMessage;
pub type TransformFuture<'a> = Pin<Box<dyn Future<Output = ()> + Send + 'a>>;
pub trait MessageTransformer: Send + Sync {
fn transform<'a>(&'a self, message: &'a mut EmailMessage) -> TransformFuture<'a>;
fn name(&self) -> &str;
fn apply<'a>(
transformers: &'a [Box<dyn MessageTransformer>],
message: &'a mut EmailMessage,
) -> TransformFuture<'a>
where
Self: Sized,
{
Box::pin(async move {
for transformer in transformers {
debug!(transformer = transformer.name(), "Applying transformer");
transformer.transform(message).await;
}
message.rebuild();
})
}
}