use crate::string_extensions::{
replace_similar_digits_with_letters, replace_similar_letters_with_digits,
};
pub struct MRZFieldRecognitionDefectsFixer;
impl MRZFieldRecognitionDefectsFixer {
pub fn fix_document_type(input: &str) -> String {
replace_similar_digits_with_letters(input)
}
pub fn fix_check_digit(input: &str) -> String {
replace_similar_letters_with_digits(input)
}
pub fn fix_date(input: &str) -> String {
replace_similar_letters_with_digits(input)
}
pub fn fix_sex(input: &str) -> String {
input
.chars()
.map(|c| match c {
'P' | 'p' => 'F',
other => other,
})
.collect()
}
pub fn fix_country_code(input: &str) -> String {
replace_similar_digits_with_letters(input)
}
pub fn fix_names(input: &str) -> String {
replace_similar_digits_with_letters(input)
}
pub fn fix_nationality(input: &str) -> String {
replace_similar_digits_with_letters(input)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_replace_similar_digits_with_letters() {
assert_eq!(
replace_similar_digits_with_letters("0 1 2 8 ABC"),
"O I Z B ABC"
);
assert_eq!(
replace_similar_digits_with_letters("MRZ<123"),
"MRZ<IZ3".replace('3', "3")
);
}
#[test]
fn test_replace_similar_letters_with_digits() {
assert_eq!(
replace_similar_letters_with_digits("OQUIDZB oquidzb"),
"0001028 0001028"
);
assert_eq!(replace_similar_letters_with_digits("ABC123"), "A8C123");
}
#[test]
fn test_fix_sex() {
assert_eq!(MRZFieldRecognitionDefectsFixer::fix_sex("P"), "F");
assert_eq!(MRZFieldRecognitionDefectsFixer::fix_sex("p"), "F");
assert_eq!(MRZFieldRecognitionDefectsFixer::fix_sex("M"), "M");
}
#[test]
fn roundtrip_example_document_type() {
let input = "1P0"; let fixed = MRZFieldRecognitionDefectsFixer::fix_document_type(input);
assert_eq!(fixed, "IPO");
}
#[test]
fn fix_check_date_example() {
let input = "OIZB"; let fixed = MRZFieldRecognitionDefectsFixer::fix_check_digit(input);
assert_eq!(fixed, "0128");
}
}