mailgen 0.4.2

Mailgen generates clean, responsive HTML and Text e-mails for sending transactional mail
Documentation
mod error;

use minijinja::Environment;
use serde::Serialize;

pub use self::error::Error;
use super::{TemplateContext, Theme};

static HTML: &str = include_str!("template.html");
static TEXT: &str = include_str!("template.text");

#[derive(Serialize)]
struct DefaultThemeContext<'a> {
    #[serde(flatten)]
    context: &'a TemplateContext<'a>,

    logo_max_height: u32,
}

#[derive(Debug, Clone)]
pub struct DefaultTheme {
    environment: Environment<'static>,

    pub logo_max_height: u32,
}

impl DefaultTheme {
    pub fn new() -> Result<Self, Error> {
        let mut environment = Environment::new();
        environment.add_template("html", HTML)?;
        environment.add_template("text", TEXT)?;

        Ok(Self {
            environment,

            logo_max_height: 50,
        })
    }

    fn render(&self, template: &str, context: &TemplateContext) -> Result<String, Error> {
        let context = DefaultThemeContext {
            context,

            logo_max_height: self.logo_max_height,
        };

        let rendered = self.environment.get_template(template)?.render(context)?;
        Ok(rendered)
    }
}

impl Theme for DefaultTheme {
    type Error = Error;

    fn html(&self, context: &TemplateContext) -> Result<String, Self::Error> {
        let html = self.render("html", context)?;
        let html = css_inline::inline(&html)?;

        Ok(html)
    }

    fn text(&self, context: &TemplateContext) -> Result<String, Self::Error> {
        let text = self.render("text", context)?;
        let text = html2text::from_read(text.as_bytes(), 80)?;

        Ok(text)
    }
}