use serde::Serialize;
#[derive(Default, Serialize)]
pub struct MailSettings {
#[serde(flatten, skip_serializing_if = "Option::is_none")]
bypass_filter_settings: Option<BypassFilterSettings>,
#[serde(skip_serializing_if = "Option::is_none")]
footer: Option<Footer>,
#[serde(skip_serializing_if = "Option::is_none")]
sandbox_mode: Option<SandboxMode>,
}
#[derive(Serialize)]
#[serde(untagged)]
pub enum BypassFilterSettings {
TopLevel(TopLevelBypassFilterSettings),
Granular(GranularBypassFilterSettings),
}
#[derive(Default, Serialize)]
pub struct TopLevelBypassFilterSettings {
#[serde(default)]
bypass_list_management: BypassListManagement,
}
#[derive(Default, Serialize)]
pub struct BypassListManagement {
enable: bool,
}
#[derive(Default, Serialize)]
pub struct GranularBypassFilterSettings {
#[serde(skip_serializing_if = "Option::is_none")]
bypass_spam_management: Option<BypassSpamManagement>,
#[serde(skip_serializing_if = "Option::is_none")]
bypass_bounce_management: Option<BypassBounceManagement>,
#[serde(skip_serializing_if = "Option::is_none")]
bypass_unsubscribe_management: Option<BypassUnsubscribeManagement>,
}
#[derive(Default, Serialize)]
pub struct BypassSpamManagement {
enable: bool,
}
#[derive(Default, Serialize)]
pub struct BypassBounceManagement {
enable: bool,
}
#[derive(Default, Serialize)]
pub struct BypassUnsubscribeManagement {
enable: bool,
}
#[derive(Default, Serialize)]
pub struct Footer {
enable: bool,
#[serde(skip_serializing_if = "Option::is_none")]
text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
html: Option<String>,
}
#[derive(Default, Serialize)]
pub struct SandboxMode {
enable: bool,
}
impl MailSettings {
pub fn new() -> Self {
Default::default()
}
pub fn set_bypass_filter_settings(mut self, settings: BypassFilterSettings) -> Self {
self.bypass_filter_settings = Some(settings);
self
}
pub fn set_footer(mut self, footer: Footer) -> Self {
self.footer = Some(footer);
self
}
pub fn set_sandbox_mode(mut self, sandbox_mode: SandboxMode) -> Self {
self.sandbox_mode = Some(sandbox_mode);
self
}
}
impl TopLevelBypassFilterSettings {
pub fn new() -> Self {
Default::default()
}
pub fn set_bypass_list_management(
mut self,
bypass_list_management: BypassListManagement,
) -> Self {
self.bypass_list_management = bypass_list_management;
self
}
}
impl BypassListManagement {
pub fn new() -> Self {
Default::default()
}
pub fn set_enable(mut self, enable: bool) -> Self {
self.enable = enable;
self
}
}
impl GranularBypassFilterSettings {
pub fn new() -> Self {
Default::default()
}
pub fn set_bypass_spam_management(
mut self,
bypass_spam_management: BypassSpamManagement,
) -> Self {
self.bypass_spam_management = Some(bypass_spam_management);
self
}
pub fn set_bypass_bounce_management(
mut self,
bypass_bounce_management: BypassBounceManagement,
) -> Self {
self.bypass_bounce_management = Some(bypass_bounce_management);
self
}
pub fn set_bypass_unsubscribe_management(
mut self,
bypass_unsubscribe_management: BypassUnsubscribeManagement,
) -> Self {
self.bypass_unsubscribe_management = Some(bypass_unsubscribe_management);
self
}
}
impl BypassSpamManagement {
pub fn new() -> Self {
Default::default()
}
pub fn set_enable(mut self, enable: bool) -> Self {
self.enable = enable;
self
}
}
impl BypassBounceManagement {
pub fn new() -> Self {
Default::default()
}
pub fn set_enable(mut self, enable: bool) -> Self {
self.enable = enable;
self
}
}
impl BypassUnsubscribeManagement {
pub fn new() -> Self {
Default::default()
}
pub fn set_enable(mut self, enable: bool) -> Self {
self.enable = enable;
self
}
}
impl Footer {
pub fn new() -> Self {
Default::default()
}
pub fn set_enable(mut self, enable: bool) -> Self {
self.enable = enable;
self
}
pub fn set_text(mut self, text: String) -> Self {
self.text = Some(text);
self
}
pub fn set_html(mut self, html: String) -> Self {
self.html = Some(html);
self
}
}
impl SandboxMode {
pub fn new() -> Self {
Default::default()
}
pub fn set_enable(mut self, enable: bool) -> Self {
self.enable = enable;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn mail_settings_empty() {
let settings = MailSettings::default();
let settings_json = serde_json::to_string(&settings).unwrap();
let expected = "{}";
assert_eq!(settings_json, expected);
}
#[test]
fn mail_settings_top_level_bypass_filters() {
let settings =
MailSettings::default().set_bypass_filter_settings(BypassFilterSettings::TopLevel(
TopLevelBypassFilterSettings::new()
.set_bypass_list_management(BypassListManagement::new().set_enable(true)),
));
let settings_json = serde_json::to_string(&settings).unwrap();
let expected = r#"{"bypass_list_management":{"enable":true}}"#;
assert_eq!(settings_json, expected);
}
#[test]
fn mail_settings_granular_bypass_filters() {
let settings =
MailSettings::new().set_bypass_filter_settings(BypassFilterSettings::Granular(
GranularBypassFilterSettings::new()
.set_bypass_unsubscribe_management(
BypassUnsubscribeManagement::new().set_enable(true),
)
.set_bypass_bounce_management(BypassBounceManagement::new().set_enable(true))
.set_bypass_spam_management(BypassSpamManagement::new().set_enable(true)),
));
let settings_json = serde_json::to_string(&settings).unwrap();
let expected = r#"{"bypass_spam_management":{"enable":true},"bypass_bounce_management":{"enable":true},"bypass_unsubscribe_management":{"enable":true}}"#;
assert_eq!(settings_json, expected);
}
#[test]
fn mail_settings_no_bypass_defaults() {
let settings = MailSettings::default()
.set_footer(Default::default())
.set_sandbox_mode(Default::default());
let settings_json = serde_json::to_string(&settings).unwrap();
let expected = r#"{"footer":{"enable":false},"sandbox_mode":{"enable":false}}"#;
assert_eq!(settings_json, expected);
}
#[test]
fn mail_settings_no_bypass() {
let settings = MailSettings::new()
.set_footer(
Footer::new()
.set_enable(true)
.set_html("html".to_string())
.set_text("text".to_string()),
)
.set_sandbox_mode(SandboxMode::new().set_enable(true));
let settings_json = serde_json::to_string(&settings).unwrap();
let expected = r#"{"footer":{"enable":true,"text":"text","html":"html"},"sandbox_mode":{"enable":true}}"#;
assert_eq!(settings_json, expected);
}
}