From cb92579461f65172d4993655000683875a8038d1 Mon Sep 17 00:00:00 2001 From: Alexander Krotov Date: Sat, 28 Mar 2020 03:24:36 +0300 Subject: [PATCH] Use slice patterns in EmailAddress::from_str() --- src/dc_tools.rs | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/dc_tools.rs b/src/dc_tools.rs index 19c7a6746..e510be1d1 100644 --- a/src/dc_tools.rs +++ b/src/dc_tools.rs @@ -494,24 +494,25 @@ impl FromStr for EmailAddress { ensure!(!input.is_empty(), "empty string is not valid"); let parts: Vec<&str> = input.rsplitn(2, '@').collect(); - ensure!(parts.len() > 1, "missing '@' character"); - let local = parts[1]; - let domain = parts[0]; + match &parts[..] { + [domain, local] => { + ensure!( + !local.is_empty(), + "empty string is not valid for local part" + ); + ensure!(domain.len() > 3, "domain is too short"); - ensure!( - !local.is_empty(), - "empty string is not valid for local part" - ); - ensure!(domain.len() > 3, "domain is too short"); + let dot = domain.find('.'); + ensure!(dot.is_some(), "invalid domain"); + ensure!(dot.unwrap() < domain.len() - 2, "invalid domain"); - let dot = domain.find('.'); - ensure!(dot.is_some(), "invalid domain"); - ensure!(dot.unwrap() < domain.len() - 2, "invalid domain"); - - Ok(EmailAddress { - local: local.to_string(), - domain: domain.to_string(), - }) + Ok(EmailAddress { + local: (*local).to_string(), + domain: (*domain).to_string(), + }) + } + _ => bail!("missing '@' character"), + } } }