fn email_local(s: &str) -> bool {
let s = s.as_bytes();
if s.len() == 0 || s.len() > 64 {
return false;
}
let mut last: u8 = 46;
for c in s.iter() {
match c {
b'#' | b'$' | b'%' | b'&' | b'\'' | b'*' | b'+' | b'-' | b'/' | b'=' | b'?' => {
last = *c;
}
b'^' | b'_' | b'`' | b'{' | b'|' | b'}' | b'~' => {
last = *c;
}
b'0'..=b'9' => {
last = *c;
}
b'A'..=b'Z' => {
last = *c;
}
b'a'..=b'z' => {
last = *c;
}
b'.' => {
if last == b'.' {
return false;
}
last = *c;
}
_ => {
return false;
}
}
}
last != b'.'
}
pub fn email(s: &str) -> bool {
let parts: Vec<&str> = s.split('@').collect();
if parts.len() != 2 {
return false;
}
match parts.get(0) {
Some(part) => {
if !email_local(part) {
return false;
}
}
None => {
return false;
}
}
match parts.get(1) {
Some(part) => {
if !crate::domain(part) {
return false;
}
}
None => {
return false;
}
}
true
}