use crate::secondary_validation::Validator;
pub struct DutchBsnChecksum;
const MULTIPLIERS: &[i32] = &[-1, 2, 3, 4, 5, 6, 7, 8, 9];
const MODULO: i32 = 11;
impl Validator for DutchBsnChecksum {
fn is_valid_match(&self, regex_match: &str) -> bool {
let valid_chars = regex_match.chars().filter(|c| c.is_ascii_alphanumeric());
let mut sum = 0;
for (idx, digit) in valid_chars.rev().enumerate() {
if let Some(digit) = digit.to_digit(10)
&& let Some(weight) = MULTIPLIERS.get(idx)
{
sum = (sum + weight * digit as i32) % MODULO;
continue;
}
return false;
}
sum == 0
}
}
#[cfg(test)]
mod test {
use crate::secondary_validation::*;
#[test]
fn test_valid_numbers() {
let valid_ids = vec![
"001855013", "1855013", "1112.22.333", "1112 22 333", ];
for id in valid_ids {
println!("testing for input {id}");
assert!(DutchBsnChecksum.is_valid_match(id));
}
}
#[test]
fn test_invalid_numbers() {
let invalid_ids = vec![
"001855014",
"C001855013",
"11111111111111111111111",
"1",
];
for id in invalid_ids {
println!("testing for input {id}");
assert!(!DutchBsnChecksum.is_valid_match(id));
}
}
}