Skip to content
Clone
main
122 lines 3.2 KB Rust
use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(default)]
pub struct EmailAddress {
pub address: String,
pub name: Option<String>,
}
impl EmailAddress {
pub fn new(address: impl Into<String>) -> Self {
Self {
address: address.into(),
name: None,
}
}
pub fn with_name(address: impl Into<String>, name: impl Into<String>) -> Self {
Self {
address: address.into(),
name: Some(name.into()),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(default)]
pub struct Attachment {
pub filename: String,
pub content_type: String,
pub data_b64: String,
pub content_id: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(default)]
pub struct SendEmailRequest {
pub request_id: Uuid,
pub to: Vec<EmailAddress>,
pub cc: Vec<EmailAddress>,
pub bcc: Vec<EmailAddress>,
pub subject: String,
pub text: Option<String>,
pub html: Option<String>,
pub reply_to: Option<EmailAddress>,
pub attachments: Vec<Attachment>,
pub metadata: HashMap<String, String>,
pub queued_at_ms: i64,
pub trace: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(default)]
pub struct BatchRecipient {
pub request_id: Uuid,
pub to: EmailAddress,
pub subject: String,
pub text: Option<String>,
pub html: Option<String>,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(default)]
pub struct SendBatchEmailRequest {
pub request_id: Uuid,
pub default_subject: String,
pub default_text: Option<String>,
pub default_html: Option<String>,
pub recipients: Vec<BatchRecipient>,
pub metadata: HashMap<String, String>,
pub queued_at_ms: i64,
pub trace: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(default)]
pub struct RenderAndSendEmailRequest {
pub request_id: Uuid,
pub template: String,
pub vars: serde_json::Value,
pub to: Vec<EmailAddress>,
pub cc: Vec<EmailAddress>,
pub bcc: Vec<EmailAddress>,
pub subject: String,
pub text: Option<String>,
pub locale: Option<String>,
pub metadata: HashMap<String, String>,
pub queued_at_ms: i64,
pub trace: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(default)]
pub struct EmailSent {
pub request_id: Uuid,
pub recipient_count: usize,
pub smtp_message_id: String,
pub sent_at_ms: i64,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(default)]
pub struct EmailFailed {
pub request_id: Uuid,
pub error: String,
pub recipient_count: usize,
pub failed_at_ms: i64,
pub metadata: HashMap<String, String>,
}
pub fn now_ms() -> i64 {
use std::time::{SystemTime, UNIX_EPOCH};
let dur = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_default();
dur.as_millis() as i64
}