use async_trait::async_trait;
use crate::email::Email;
use crate::error::SendError;
#[derive(Debug, Clone)]
pub struct SendResult {
pub message_id: Option<String>,
}
#[derive(Debug)]
pub enum BatchItemResult {
Success(SendResult),
Failed(SendError),
}
#[async_trait]
pub trait Mailer: Send + Sync {
async fn send(&self, email: &Email) -> Result<SendResult, SendError>;
async fn batch_send(&self, emails: &[Email]) -> Result<Vec<BatchItemResult>, SendError> {
if emails.is_empty() {
return Err(SendError::BatchEmpty);
}
let mut results = Vec::with_capacity(emails.len());
for email in emails {
results.push(match self.send(email).await {
Ok(r) => BatchItemResult::Success(r),
Err(e) => BatchItemResult::Failed(e),
});
}
Ok(results)
}
}