use aho_corasick::{AhoCorasick, MatchKind};
use std::borrow::Cow;
pub(crate) fn normalize_weekdays<'a>(text: &'a str, mappings: &[(&str, &str)]) -> Cow<'a, str> {
if mappings.is_empty() {
return Cow::Borrowed(text);
}
let patterns: Vec<&str> = mappings.iter().map(|(loc, _)| *loc).collect();
let replacements: Vec<&str> = mappings.iter().map(|(_, eng)| *eng).collect();
let ac = match AhoCorasick::builder()
.match_kind(MatchKind::LeftmostFirst)
.build(&patterns)
{
Ok(ac) => ac,
Err(_) => return Cow::Borrowed(text),
};
if !ac.is_match(text) {
return Cow::Borrowed(text);
}
Cow::Owned(ac.replace_all(text, &replacements))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn returns_borrowed_when_no_match() {
let mappings = [("Понедельник", "Monday")];
let out = normalize_weekdays("English text", &mappings);
assert!(matches!(out, Cow::Borrowed(_)));
}
#[test]
fn substitutes_known_localized_name() {
let mappings = [("Понедельник", "Monday"), ("Пн", "Mon")];
let out = normalize_weekdays("<2024-12-09 Пн>", &mappings);
assert_eq!(out, "<2024-12-09 Mon>");
}
#[test]
fn empty_mappings_passthrough() {
let out = normalize_weekdays("<2024-12-09 Mon>", &[]);
assert_eq!(out, "<2024-12-09 Mon>");
}
#[test]
fn leftmost_first_resolves_overlap() {
let mappings = [("Понедельник", "Monday"), ("По", "Mo")];
let out = normalize_weekdays("<2024-12-09 Понедельник>", &mappings);
assert_eq!(out, "<2024-12-09 Monday>");
}
#[test]
fn substitutes_multiple_distinct_localized_names() {
let mappings = [("Пн", "Mon"), ("Вт", "Tue"), ("Ср", "Wed")];
let out = normalize_weekdays("Пн Вт Ср", &mappings);
assert_eq!(out, "Mon Tue Wed");
}
}