summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-05-02 13:23:01 +0200
committerMatthias Beyer <mail@beyermatthias.de>2020-06-01 14:02:08 +0200
commitad5b894f50e83381ae4937945e0a26ef8b1318d0 (patch)
tree1a8375780a574ebd834aefa4bcc7552177d8247f
parent34f9bd187ce830e778fbb66035668845b19593dd (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.rs30
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(())
+ }
+}
+