pub fn is_valid_ssn_programmatically(ssn: &str) -> bool {
let parts: Vec<&str> = ssn.split('-').collect();
if parts.len() != 3 {
return false;
}
let area = parts[0];
let group = parts[1];
let serial = parts[2];
if area.len() != 3 || !area.chars().all(|c| c.is_ascii_digit()) ||
group.len() != 2 || !group.chars().all(|c| c.is_ascii_digit()) ||
serial.len() != 4 || !serial.chars().all(|c| c.is_ascii_digit())
{
return false;
}
let area_num = area.parse::<u16>().unwrap_or(0);
let group_num = group.parse::<u8>().unwrap_or(0);
let serial_num = serial.parse::<u16>().unwrap_or(0);
if area_num == 0 || area_num == 666 || (area_num >= 900 && area_num <= 999) ||
(area_num >= 700 && area_num <= 729) {
return false;
}
if group_num == 0 {
return false;
}
if serial_num == 0 {
return false;
}
true
}
pub fn is_valid_uk_nino_programmatically(nino: &str) -> bool {
let nino = nino.to_uppercase().replace(" ", "");
if nino.len() != 9 {
return false;
}
let chars: Vec<char> = nino.chars().collect();
if !chars[0].is_ascii_alphabetic() || !chars[1].is_ascii_alphabetic() {
return false;
}
for i in 2..8 {
if !chars[i].is_ascii_digit() {
return false;
}
}
if !chars[8].is_ascii_alphabetic() {
return false;
}
let prefix = &nino[0..2];
let suffix = chars[8];
let specific_invalid_prefixes = [
"BF", "BG", "EH", "GB", "JE", "NK", "KN", "LI", "NT", "TN", "ZZ",
];
if specific_invalid_prefixes.contains(&prefix) {
return false;
}
let invalid_prefix_chars = ['D', 'F', 'I', 'Q', 'U', 'V', 'O'];
if invalid_prefix_chars.contains(&chars[0]) || invalid_prefix_chars.contains(&chars[1]) {
return false;
}
if !matches!(suffix, 'A' | 'B' | 'C' | 'D') {
return false;
}
true
}