use crate::prelude::*;
#[derive(Debug, Clone, Builder, Getters, PartialEq)]
pub struct Email {
#[builder(default)]
#[getset(get = "pub")]
public_recipients: IndexSet<EmailAddress>,
#[builder(default)]
#[getset(get = "pub")]
cc_recipients: IndexSet<EmailAddress>,
#[builder(default)]
#[getset(get = "pub")]
bcc_recipients: IndexSet<EmailAddress>,
#[builder(default)]
#[getset(get = "pub")]
subject: String,
body: Option<String>,
#[getset(get = "pub")]
reply_to: Option<EmailAccount>,
#[builder(default)]
#[getset(get = "pub")]
attachments: IndexSet<Attachment>,
}
impl Email {
pub fn body(&self) -> String {
self.body.clone().unwrap_or_default()
}
}
impl From<(DecryptedEmailSettings, NamedPdf)> for Email {
fn from((settings, pdf): (DecryptedEmailSettings, NamedPdf)) -> Self {
let (subject, body) = settings.template().materialize(pdf.prepared_data());
Email::builder()
.subject(subject)
.body(body)
.public_recipients(settings.recipients().clone())
.cc_recipients(settings.cc_recipients().clone())
.bcc_recipients(settings.bcc_recipients().clone())
.attachments(IndexSet::from([Attachment::Pdf(pdf)]))
.build()
}
}
impl HasSample for Email {
fn sample() -> Self {
Self::builder()
.public_recipients(IndexSet::from_iter(vec![EmailAddress::sample_bob()]))
.cc_recipients(IndexSet::from_iter(vec![EmailAddress::sample_carol()]))
.bcc_recipients(IndexSet::from_iter(vec![EmailAddress::sample_erin()]))
.subject("Sample Email Subject".to_string())
.body("This is a sample email body.".to_string())
.attachments(IndexSet::from_iter(vec![Attachment::Pdf(
NamedPdf::sample(),
)]))
.build()
}
fn sample_other() -> Self {
Self::builder()
.public_recipients(IndexSet::from_iter(vec![EmailAddress::sample_alice()]))
.cc_recipients(IndexSet::from_iter(vec![EmailAddress::sample_dave()]))
.subject("Another Sample Email Subject".to_string())
.body("This is another sample email body.".to_string())
.attachments(IndexSet::from_iter(vec![Attachment::Pdf(
NamedPdf::sample_other(),
)]))
.build()
}
}
#[cfg(test)]
mod tests {
use super::*;
type Sut = Email;
#[test]
fn equality() {
assert_eq!(Sut::sample(), Sut::sample());
assert_eq!(Sut::sample_other(), Sut::sample_other());
}
#[test]
fn inequality() {
assert_ne!(Sut::sample(), Sut::sample_other());
}
}