From 7d4f78fe5df1e5e8ac2c68d48f3c60ca4ebf6019 Mon Sep 17 00:00:00 2001 From: Oscar Beaumont Date: Sun, 19 Dec 2021 20:50:10 +0800 Subject: [PATCH] replace custom email validation with fast_chemail --- Cargo.toml | 1 + src/validators/email.rs | 55 +++++++---------------------------------- 2 files changed, 10 insertions(+), 46 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 02856011..3379adcb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,6 +70,7 @@ sha2 = { version = "0.9.3", optional = true } futures-timer = { version = "3.0.2", optional = true } futures-channel = { version = "0.3.13", optional = true } serde_cbor = { version = "0.11.1", optional = true } +fast_chemail = "0.9.6" [dev-dependencies] tokio = { version = "1.4.0", features = ["macros", "rt-multi-thread", "sync", "time"] } diff --git a/src/validators/email.rs b/src/validators/email.rs index 09f69a9c..de6e1e60 100644 --- a/src/validators/email.rs +++ b/src/validators/email.rs @@ -1,13 +1,8 @@ use crate::{InputType, InputValueError}; -use once_cell::sync::Lazy; -use regex::Regex; - -static EMAIL_RE: Lazy = Lazy::new(|| { - Regex::new("^(([0-9A-Za-z!#$%&'*+-/=?^_`{|}~&&[^@]]+)|(\"([0-9A-Za-z!#$%&'*+-/=?^_`{|}~ \"(),:;<>@\\[\\\\\\]]+)\"))@").unwrap() -}); +use fast_chemail::is_valid_email; pub fn email + InputType>(value: &T) -> Result<(), InputValueError> { - if EMAIL_RE.is_match(value.as_ref()) { + if is_valid_email(value.as_ref()) { Ok(()) } else { Err("invalid email".into()) @@ -20,45 +15,13 @@ mod tests { #[test] fn test_email() { - let test_cases = [ - // Invalid emails - ("plainaddress", true), - // ("#@%^%#$@#$@#.com", true), - ("@example.com", true), - ("Joe Smith ", true), - ("email.example.com", true), - // ("email@example@example.com", true), - // (".email@example.com", true), - // ("email.@example.com", true), - // ("email..email@example.com", true), - ("あいうえお@example.com", true), - // ("email@example.com (Joe Smith)", true), - // ("email@example", true), - // ("email@-example.com", true), - // ("email@example.web", true), - // ("email@111.222.333.44444", true), - // ("email@example..com", true), - // ("Abc..123@example.com", true), - // Valid Emails - ("email@example.com", false), - ("firstname.lastname@example.com", false), - ("email@subdomain.example.com", false), - ("firstname+lastname@example.com", false), - ("email@123.123.123.123", false), - ("email@[123.123.123.123]", false), - // This returns parsing error - // (r#""email"@example.com"#, false), - ("1234567890@example.com", false), - ("email@example-one.com", false), - ("_______@example.com", false), - ("email@example.name", false), - ("email@example.museum", false), - ("email@example.co.jp", false), - ("firstname-lastname@example.com", false), - ]; + assert!(email(&"joe@example.com".to_string()).is_ok()); + assert!(email(&"joe.test@example.com".to_string()).is_ok()); + assert!(email(&"email@example-one.com".to_string()).is_ok()); + assert!(email(&"1234567890@example.com".to_string()).is_ok()); - for (s, res) in test_cases { - assert_eq!(email(&s.to_string()).is_err(), res); - } + assert!(email(&"plainaddress".to_string()).is_err()); + assert!(email(&"@example.com".to_string()).is_err()); + assert!(email(&"email.example.com".to_string()).is_err()); } }