validator_async/validation/
non_control_character.rs

1pub 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}