From 83ea1aa1912c7c0b90ebf3c65bfada87f9a4acd4 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sat, 2 May 2020 13:42:27 +0200 Subject: Make to-field parsing available for all recipient-fields Signed-off-by: Matthias Beyer --- bin/domain/imag-mail/src/new.rs | 59 ++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/bin/domain/imag-mail/src/new.rs b/bin/domain/imag-mail/src/new.rs index 4c769a1d..3a6abcc9 100644 --- a/bin/domain/imag-mail/src/new.rs +++ b/bin/domain/imag-mail/src/new.rs @@ -149,27 +149,44 @@ fn mk_processed_template(rt: &Runtime, scmd: &ArgMatches, config: &MailConfig) - }) })); - { // parse "to" data, whether it is StoreId or String, also set to_name and has_to_name if there is a name present for the "to" data - let to = scmd - .value_of("to") - .map(String::from) - .ok_or_else(|| { - err_msg("Missing value for field field: 'to'") - })?; + fn parse_recipient_data(scmd: &ArgMatches, + hb_data: &mut BTreeMap, + primary_field: &str, + fail_if_absent: bool, + name_field: &str, + has_field: &str) + -> Result<()> + { + let to = match scmd.value_of(primary_field).map(String::from) { + Some(to) => to, + None => if fail_if_absent { + return Err(format_err!("Missing value for field field: '{}'", primary_field)) + } else { + return Ok(()) + }, + }; // Assume it is string for now // TODO: Check whether `to` is a StoreId (here) let (addr, _) = email_format::rfc5322::types::NameAddr::parse(to.as_bytes())?; - if let Some(display_name) = addr.display_name { - hb_data.insert(String::from("to_name"), HandlebarsData::Str(format!("{}", display_name))); - hb_data.insert(String::from("has_to_name"), HandlebarsData::Bool(true)); + let has_field_val = if let Some(display_name) = addr.display_name { + hb_data.insert(String::from(name_field), HandlebarsData::Str(format!("{}", display_name))); + true } else { - hb_data.insert(String::from("has_to_name"), HandlebarsData::Bool(false)); - } + false + }; - hb_data.insert(String::from("to"), HandlebarsData::Str(to)); - } + hb_data.insert(String::from(has_field), HandlebarsData::Bool(has_field_val)); + hb_data.insert(String::from(primary_field), HandlebarsData::Str(to)); + Ok(()) + }; + + + // parse "to" data, whether it is StoreId or String, also set to_name and has_to_name if there is a name present for the "to" data + parse_recipient_data(&scmd, &mut hb_data, "to", true, "to_name", "has_to_name")?; + parse_recipient_data(&scmd, &mut hb_data, "cc", false, "cc_name", "has_cc_name")?; + parse_recipient_data(&scmd, &mut hb_data, "bcc", false, "bcc_name", "has_bcc_name")?; if let Some(in_reply_to) = scmd.value_of("in-reply-to").map(String::from) { hb_data.insert(String::from("is_in_reply_to") , HandlebarsData::Bool(true)); @@ -178,20 +195,6 @@ fn mk_processed_template(rt: &Runtime, scmd: &ArgMatches, config: &MailConfig) - hb_data.insert(String::from("is_in_reply_to") , HandlebarsData::Bool(false)); } - if let Some(cc) = scmd.value_of("cc").map(String::from) { - hb_data.insert(String::from("has_cc") , HandlebarsData::Bool(true)); - hb_data.insert(String::from("cc") , HandlebarsData::Str(cc)); - } else { - hb_data.insert(String::from("has_cc") , HandlebarsData::Bool(false)); - } - - if let Some(bcc) = scmd.value_of("bcc").map(String::from) { - hb_data.insert(String::from("has_bcc") , HandlebarsData::Bool(true)); - hb_data.insert(String::from("bcc") , HandlebarsData::Str(bcc)); - } else { - hb_data.insert(String::from("has_bcc") , HandlebarsData::Bool(false)); - } - hb_data.insert(String::from("subject"), HandlebarsData::Str({ scmd.value_of("subject") .map(String::from) -- cgit v1.2.3