use super::EmailError;
pub trait EmailTemplate {
fn render_email(&self) -> Result<(Option<String>, Option<String>), EmailError>;
}
pub trait SimpleEmailTemplate: askama::Template {
fn render_html(&self) -> Result<String, EmailError> {
Ok(self.render()?)
}
fn render_text(&self) -> Result<Option<String>, EmailError> {
Ok(None)
}
}
impl<T: SimpleEmailTemplate> EmailTemplate for T {
fn render_email(&self) -> Result<(Option<String>, Option<String>), EmailError> {
let html = Some(self.render_html()?);
let text = self.render_text()?;
Ok((html, text))
}
}
#[cfg(test)]
mod tests {
use super::*;
use askama::Template;
#[derive(Template)]
#[template(source = "<h1>Hello, {{ name }}!</h1>", ext = "html")]
struct TestTemplate {
name: String,
}
impl SimpleEmailTemplate for TestTemplate {}
#[test]
fn test_simple_email_template() {
let template = TestTemplate {
name: "Alice".to_string(),
};
let (html, text) = template.render_email().unwrap();
assert!(html.is_some());
assert_eq!(html.unwrap(), "<h1>Hello, Alice!</h1>");
assert!(text.is_none());
}
#[derive(Template)]
#[template(source = "<h1>Welcome, {{ name }}!</h1>", ext = "html")]
struct TestTemplateWithText {
name: String,
}
impl SimpleEmailTemplate for TestTemplateWithText {
fn render_text(&self) -> Result<Option<String>, EmailError> {
Ok(Some(format!("Welcome, {}!", self.name)))
}
}
#[test]
fn test_email_template_with_text() {
let template = TestTemplateWithText {
name: "Bob".to_string(),
};
let (html, text) = template.render_email().unwrap();
assert!(html.is_some());
assert_eq!(html.unwrap(), "<h1>Welcome, Bob!</h1>");
assert!(text.is_some());
assert_eq!(text.unwrap(), "Welcome, Bob!");
}
}