1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
/// Trims ASCII whitespace characters from a slice, and returns the trimmed input.
pub fn trim_ascii_whitespace(input: &str) -> &str {
if input.is_empty() {
return input;
}
let mut start = 0;
{
let mut iter = input.as_bytes().iter();
loop {
let byte = match iter.next() {
Some(b) => b,
None => return "",
};
if !byte.is_ascii_whitespace() {
break;
}
start += 1;
}
}
let mut end = input.len();
assert!(start < end);
{
let mut iter = input.as_bytes()[start..].iter().rev();
loop {
let byte = match iter.next() {
Some(b) => b,
None => {
debug_assert!(false, "We should have caught this in the loop above!");
return "";
},
};
if !byte.is_ascii_whitespace() {
break;
}
end -= 1;
}
}
&input[start..end]
}
#[test]
fn trim_ascii_whitespace_test() {
fn test(i: &str, o: &str) {
assert_eq!(trim_ascii_whitespace(i), o)
}
test("", "");
test(" ", "");
test(" a b c ", "a b c");
test(" \t \t \ta b c \t \t \t \t", "a b c");
}