use super::error::CfiError;
pub(super) fn normalize(input: &str) -> Result<[u8; 6], CfiError> {
if input.is_empty() {
return Err(CfiError::Empty);
}
let trimmed = input.trim();
let found = trimmed.chars().count();
if found != 6 {
return Err(CfiError::InvalidLength { found });
}
let mut buf = [0u8; 6];
for (i, ch) in trimmed.chars().enumerate() {
if !ch.is_ascii() {
return Err(CfiError::InvalidCharacter {
character: ch,
position: (i + 1) as u8,
});
}
buf[i] = ch.to_ascii_uppercase() as u8;
}
Ok(buf)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn rejects_empty() {
assert_eq!(normalize(""), Err(CfiError::Empty));
}
#[test]
fn trims_surrounding_whitespace() {
assert_eq!(normalize(" ESVUFR "), normalize("ESVUFR"));
}
#[test]
fn uppercases_letters() {
assert_eq!(normalize("esvufr").unwrap(), *b"ESVUFR");
}
#[test]
fn rejects_wrong_length() {
assert_eq!(normalize("ESVU"), Err(CfiError::InvalidLength { found: 4 }));
}
#[test]
fn whitespace_only_is_a_length_error() {
assert_eq!(normalize(" "), Err(CfiError::InvalidLength { found: 0 }));
}
#[test]
fn keeps_interior_characters_for_validation() {
assert_eq!(normalize("ES VFR").unwrap(), *b"ES VFR");
}
#[test]
fn rejects_non_ascii() {
let err = normalize("ESVUF£").unwrap_err();
assert!(matches!(
err,
CfiError::InvalidCharacter {
character: '£', ..
}
));
}
}