use serde::Deserialize;
use crate::error::SendError;
use crate::mailer::Mailer;
#[derive(Debug, Clone, Deserialize)]
#[serde(tag = "provider", rename_all = "snake_case")]
pub enum ProviderConfig {
#[cfg(feature = "lettermint")]
Lettermint { token: String },
#[cfg(feature = "postmark")]
Postmark { token: String },
#[cfg(feature = "sendgrid")]
Sendgrid { api_key: String },
#[cfg(feature = "smtp")]
Smtp {
host: String,
#[serde(default)]
port: Option<u16>,
#[serde(default)]
tls: crate::provider::smtp::SmtpTls,
#[serde(default)]
user: Option<String>,
#[serde(default)]
pass: Option<String>,
},
}
impl ProviderConfig {
pub fn build(self) -> Result<Box<dyn Mailer>, SendError> {
match self {
#[cfg(feature = "lettermint")]
ProviderConfig::Lettermint { token } => Ok(Box::new(
crate::provider::lettermint::LettermintMailer::new(token),
)),
#[cfg(feature = "postmark")]
ProviderConfig::Postmark { token } => Ok(Box::new(
crate::provider::postmark::PostmarkMailer::new(token),
)),
#[cfg(feature = "sendgrid")]
ProviderConfig::Sendgrid { api_key } => Ok(Box::new(
crate::provider::sendgrid::SendgridMailer::new(api_key),
)),
#[cfg(feature = "smtp")]
ProviderConfig::Smtp {
host,
port,
tls,
user,
pass,
} => {
let mut b = crate::provider::smtp::SmtpMailer::builder(host).tls(tls);
if let Some(p) = port {
b = b.port(p);
}
if let (Some(u), Some(pw)) = (user, pass) {
b = b.credentials(u, pw);
}
Ok(Box::new(b.build()?))
}
}
}
}