use crate::ports::PatternMatch;
pub(super) fn original_match_str(original: &str, lower: &str, matched: &PatternMatch) -> String {
debug_assert_eq!(
lower.len(),
original.len(),
"ASCII-lowercase invariant: lower.len() must equal original.len()"
);
if lower.len() == original.len() {
original
.get(matched.start..matched.end)
.map(str::to_string)
.unwrap_or_else(|| matched.matched_text.clone())
} else {
matched.matched_text.clone()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::patterns::try_compile;
#[test]
fn original_match_str_falls_back_safely_on_nonascii_breakage() {
let original = "İSTANBUL CURL X";
let lower = original.to_ascii_lowercase();
if lower.len() == original.len() {
return;
}
let matches = try_compile("curl").unwrap().find_matches(&lower);
if let Some(m) = matches.into_iter().next() {
let evidence = original_match_str(original, &lower, &m);
assert!(["curl", "CURL"].contains(&evidence.as_str()));
}
}
}