use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EmailTemplate {
pub name: String,
pub subject: String,
pub body_html: String,
#[serde(default)]
pub body_plaintext: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub preheader: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub should_inline_css: Option<bool>,
#[serde(default)]
pub tags: Vec<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn email_template_yaml_roundtrip() {
let t = EmailTemplate {
name: "welcome".into(),
subject: "Welcome".into(),
body_html: "<p>hi</p>".into(),
body_plaintext: "hi".into(),
description: Some("Welcome email".into()),
preheader: Some("Get started".into()),
should_inline_css: Some(true),
tags: vec!["onboarding".into()],
};
let yaml = serde_norway::to_string(&t).unwrap();
let parsed: EmailTemplate = serde_norway::from_str(&yaml).unwrap();
assert_eq!(t, parsed);
}
#[test]
fn empty_plaintext_is_valid() {
let t = EmailTemplate {
name: "html_only".into(),
subject: "x".into(),
body_html: "<p>x</p>".into(),
body_plaintext: String::new(),
description: None,
preheader: None,
should_inline_css: None,
tags: vec![],
};
let yaml = serde_norway::to_string(&t).unwrap();
let parsed: EmailTemplate = serde_norway::from_str(&yaml).unwrap();
assert_eq!(parsed.body_plaintext, "");
}
}