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