pub fn domain(d: &str) -> bool {
let b = d.as_bytes();
let l = b.len();
if l < 3 {
return false;
}
if l > 254 {
return false;
}
if l == 254 && b[l - 1] != b'.' {
return false;
}
if b[0] == b'.' {
return false;
}
let mut num_dots = 0;
let mut last = b'.';
let mut non_numeric = false; let mut part_len = 0;
for c in b.iter() {
match c {
b'-' => {
if last == b'.' {
return false;
}
part_len += 1;
non_numeric = true;
}
b'.' => {
if last == b'.' {
return false;
}
if last == b'-' {
return false;
}
if part_len > 63 {
return false;
}
if part_len == 0 {
return false;
}
num_dots += 1;
part_len = 0;
}
b'0'..=b'9' => {
part_len += 1;
}
b'A'..=b'Z' => {
non_numeric = true;
part_len += 1;
}
b'_' => {
non_numeric = true;
part_len += 1;
}
b'a'..=b'z' => {
non_numeric = true;
part_len += 1;
}
_ => {
return false;
}
}
last = *c;
}
if last == b'-' {
return false;
}
if part_len > 63 {
return false;
}
if last == b'.' && num_dots == 1 {
return false;
}
non_numeric && num_dots > 0
}