validator_async/validation/
non_control_character.rs1pub trait ValidateNonControlCharacter {
2 fn validate_non_control_character(&self) -> bool {
3 self.as_non_control_character_iterator().all(|code| !code.is_control())
4 }
5
6 fn as_non_control_character_iterator(&self) -> Box<dyn Iterator<Item = char> + '_>;
7}
8
9impl<T: AsRef<str>> ValidateNonControlCharacter for T {
10 fn as_non_control_character_iterator(&self) -> Box<dyn Iterator<Item = char> + '_> {
11 Box::new(self.as_ref().chars())
12 }
13}
14
15#[cfg(test)]
16mod tests {
17 use super::ValidateNonControlCharacter;
18 use std::borrow::Cow;
19
20 #[test]
21 fn test_non_control_character() {
22 let tests = vec![
23 ("Himmel", true),
24 ("आकाश", true),
25 ("வானத்தில்", true),
26 ("하늘", true),
27 ("небо", true),
28 ("2H₂ + O₂ ⇌ 2H₂O", true),
29 ("\u{000c}", false),
30 ("\u{009F}", false),
31 ];
32
33 for (input, expected) in tests {
34 assert_eq!(input.validate_non_control_character(), expected);
35 }
36 }
37
38 #[test]
39 fn test_non_control_character_cow() {
40 let test: Cow<'static, str> = "आकाश".into();
41 assert!(test.validate_non_control_character());
42 let test: Cow<'static, str> = String::from("வானத்தில்").into();
43 assert!(test.validate_non_control_character());
44 let test: Cow<'static, str> = "\u{000c}".into();
45 assert!(!test.validate_non_control_character());
46 let test: Cow<'static, str> = String::from("\u{009F}").into();
47 assert!(!test.validate_non_control_character());
48 }
49}