Merge pull request #758 from oscartbeaumont/email-validator-pr

replace custom email validation with fast_chemail
This commit is contained in:
Sunli 2021-12-20 15:17:33 +08:00 committed by GitHub
commit 0dedc8dca2
2 changed files with 10 additions and 46 deletions

View File

@ -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"] }

View File

@ -1,13 +1,8 @@
use crate::{InputType, InputValueError};
use once_cell::sync::Lazy;
use regex::Regex;
static EMAIL_RE: Lazy<Regex> = Lazy::new(|| {
Regex::new("^(([0-9A-Za-z!#$%&'*+-/=?^_`{|}~&&[^@]]+)|(\"([0-9A-Za-z!#$%&'*+-/=?^_`{|}~ \"(),:;<>@\\[\\\\\\]]+)\"))@").unwrap()
});
use fast_chemail::is_valid_email;
pub fn email<T: AsRef<str> + InputType>(value: &T) -> Result<(), InputValueError<T>> {
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 <email@example.com>", 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());
}
}