use std::borrow::Cow;
#[must_use]
pub fn untrusted(value: &str) -> Cow<'_, str> {
if !value.chars().any(escaped) {
return Cow::Borrowed(value);
}
let mut written = String::with_capacity(value.len().saturating_add(16));
for character in value.chars() {
if escaped(character) {
written.extend(character.escape_unicode());
} else {
written.push(character);
}
}
Cow::Owned(written)
}
fn escaped(character: char) -> bool {
character.is_control()
|| matches!(
character,
'\u{061c}'
| '\u{200e}'
| '\u{200f}'
| '\u{202a}'..='\u{202e}'
| '\u{2028}'
| '\u{2029}'
| '\u{2066}'..='\u{2069}'
| '\u{feff}'
| '\u{fffe}'
| '\u{ffff}'
)
}
#[cfg(test)]
mod tests {
use super::untrusted;
#[test]
fn a_value_with_nothing_to_escape_is_borrowed() {
assert!(matches!(untrusted("plain"), std::borrow::Cow::Borrowed(_)));
}
#[test]
fn an_escaped_character_is_its_lower_case_code_point() {
assert_eq!(untrusted("a\u{202E}b\u{7}"), r"a\u{202e}b\u{7}");
}
}