pub fn mask_iban(iban: &str) -> String {
let compact: String = iban.chars().filter(|c| !c.is_whitespace()).collect();
if compact.len() <= 6 {
return "*".repeat(compact.len());
}
let masked: String = compact
.char_indices()
.map(|(index, character)| {
if index < 2 || index >= compact.len() - 4 {
character
} else {
'*'
}
})
.collect();
masked
.as_bytes()
.chunks(4)
.map(|chunk| String::from_utf8_lossy(chunk).into_owned())
.collect::<Vec<_>>()
.join(" ")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn masking_keeps_only_the_country_and_the_last_four() {
let expected = "TR** **** **** **** **** **13 26";
assert_eq!(mask_iban("TR330006100519786457841326"), expected);
assert_eq!(mask_iban("TR33 0006 1005 1978 6457 8413 26"), expected);
assert_eq!(mask_iban("TR3300"), "******");
assert_eq!(mask_iban(""), "");
}
}