pub(crate) fn is_whitespace(character: char) -> bool {
(character.is_whitespace() && character != '\u{85}') || character == '\u{feff}'
}
pub(crate) fn trim(text: &str) -> &str {
text.trim_matches(is_whitespace)
}
pub(crate) fn trim_start(text: &str) -> &str {
text.trim_start_matches(is_whitespace)
}
pub(crate) fn trim_end(text: &str) -> &str {
text.trim_end_matches(is_whitespace)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_byte_order_mark_is_whitespace_and_the_next_line_control_is_not() {
assert_eq!(trim("\u{feff}value\u{feff}"), "value");
assert!(
"\u{feff}value\u{feff}".trim() != "value",
"str::trim keeps it, which is the divergence"
);
assert_eq!(trim("\u{85}value\u{85}"), "\u{85}value\u{85}");
assert!(
"\u{85}value\u{85}".trim() == "value",
"str::trim removes it, which is the other half"
);
}
#[test]
fn ordinary_whitespace_is_trimmed_from_either_end() {
assert_eq!(trim(" value\t\n"), "value");
assert_eq!(trim_start(" value "), "value ");
assert_eq!(trim_end(" value "), " value");
assert_eq!(trim("\u{a0}\u{2028}value\u{3000}"), "value");
}
#[test]
fn a_value_of_nothing_but_whitespace_trims_to_nothing() {
assert!(trim("\u{feff} \t ").is_empty());
assert!(trim("").is_empty());
}
#[test]
fn nothing_inside_a_value_is_touched() {
assert_eq!(trim("a\u{feff}b"), "a\u{feff}b");
assert_eq!(trim(" a b "), "a b");
}
}