diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-05-02 13:23:01 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-06-01 14:02:08 +0200 |
commit | ad5b894f50e83381ae4937945e0a26ef8b1318d0 (patch) | |
tree | 1a8375780a574ebd834aefa4bcc7552177d8247f | |
parent | 34f9bd187ce830e778fbb66035668845b19593dd (diff) |
Add helper to get name from "to"/"cc"/"bcc" field
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | bin/domain/imag-mail/src/new.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/bin/domain/imag-mail/src/new.rs b/bin/domain/imag-mail/src/new.rs index e70266d3..e5c75d2e 100644 --- a/bin/domain/imag-mail/src/new.rs +++ b/bin/domain/imag-mail/src/new.rs @@ -19,6 +19,7 @@ use std::path::PathBuf; use std::collections::BTreeMap; +use std::result::Result as RResult; use failure::Fallible as Result; use failure::err_msg; @@ -32,6 +33,13 @@ use chrono::Local; use email_format::Email; use email_format::rfc5322::Parsable; use handlebars::Handlebars; +use handlebars::RenderContext; +use handlebars::RenderError; +use handlebars::Context; +use handlebars::Helper; +use handlebars::HelperDef; +use handlebars::Output; +use handlebars::JsonRender; use failure::Error; use libimagmail::mail::Mail; @@ -214,6 +222,7 @@ fn edit_message_validated(rt: &Runtime, mut msg: String) -> Result<String> { fn process_template(template: &str, data: &BTreeMap<String, HandlebarsData>) -> Result<String> { let mut hb = Handlebars::new(); + hb.register_helper("get_name", Box::new(GetNameHelper)); hb.register_template_string("format", template)?; hb.register_escape_fn(::handlebars::no_escape); @@ -231,3 +240,24 @@ fn generate_message_id(config: &MailConfig) -> Result<String> { now.timestamp_subsec_nanos(), config.get_from_address())) } + +#[derive(Clone, Copy)] +pub struct GetNameHelper; +impl HelperDef for GetNameHelper { + fn call<'reg: 'rc, 'rc>(&self, + h: &Helper<'reg, 'rc>, + hb: &'reg Handlebars, + _ctx: &'rc Context, + _rc: &mut RenderContext<'reg>, + out: &mut dyn Output) + -> RResult<(), RenderError> + { + let p = h.param(0).ok_or_else(|| RenderError::new("Too few arguments"))?; + let p = p.value().render(); + let (addr, _) = email_format::rfc5322::types::AddrSpec::parse(p.as_bytes()) + .map_err(|e| RenderError::new(format!("Failed to parse: {}", e)))?; + out.write(&format!("{}", addr))?; + Ok(()) + } +} + |