1#[must_use]
5pub const fn is_whitespace(character: char) -> bool {
6 matches!(
7 character,
8 '\u{0009}'..='\u{000d}'
9 | '\u{001c}'..='\u{0020}'
10 | '\u{1680}'
11 | '\u{2000}'..='\u{2006}'
12 | '\u{2008}'..='\u{200a}'
13 | '\u{2028}'
14 | '\u{2029}'
15 | '\u{205f}'
16 | '\u{3000}'
17 )
18}
19
20#[must_use]
22pub const fn is_space_char(character: char) -> bool {
23 matches!(
24 character,
25 '\u{0020}' | '\u{00a0}' | '\u{1680}' | '\u{2000}'
26 ..='\u{200a}' | '\u{2028}' | '\u{2029}' | '\u{202f}' | '\u{205f}' | '\u{3000}'
27 )
28}
29
30#[must_use]
32pub fn is_blank(value: &str) -> bool {
33 value
34 .chars()
35 .all(|character| is_whitespace(character) || is_space_char(character))
36}
37
38#[cfg(test)]
39mod tests {
40 use super::{is_blank, is_space_char, is_whitespace};
41
42 #[test]
43 fn matches_java_whitespace_exclusions() {
44 assert!(is_whitespace(' '));
45 assert!(is_whitespace('\u{1680}'));
46 for non_breaking_space in ['\u{0085}', '\u{00a0}', '\u{2007}', '\u{202f}'] {
47 assert!(!is_whitespace(non_breaking_space));
48 }
49 }
50
51 #[test]
52 fn space_char_includes_unicode_space_separators() {
53 for space in [' ', '\u{00a0}', '\u{2007}', '\u{202f}'] {
54 assert!(is_space_char(space));
55 }
56 assert!(!is_space_char('\u{0085}'));
57 }
58
59 #[test]
60 fn blank_combines_java_whitespace_and_space_char() {
61 assert!(is_blank(""));
62 assert!(is_blank("\u{001c}\u{00a0}\u{202f}"));
63 assert!(!is_blank("\u{0085}"));
64 assert!(!is_blank(" text "));
65 }
66}