validator_async/validation/
contains.rs

1use std::borrow::Cow;
2use std::collections::HashMap;
3use std::hash::BuildHasher;
4
5pub trait ValidateContains {
6    fn validate_contains(&self, needle: &str) -> bool;
7}
8
9impl ValidateContains for String {
10    fn validate_contains(&self, needle: &str) -> bool {
11        self.contains(needle)
12    }
13}
14
15impl<T> ValidateContains for Option<T>
16where
17    T: ValidateContains,
18{
19    fn validate_contains(&self, needle: &str) -> bool {
20        if let Some(v) = self {
21            v.validate_contains(needle)
22        } else {
23            true
24        }
25    }
26}
27
28impl<T> ValidateContains for &T
29where
30    T: ValidateContains,
31{
32    fn validate_contains(&self, needle: &str) -> bool {
33        T::validate_contains(self, needle)
34    }
35}
36
37impl<T> ValidateContains for Cow<'_, T>
38where
39    T: ToOwned + ?Sized,
40    for<'a> &'a T: ValidateContains,
41{
42    fn validate_contains(&self, needle: &str) -> bool {
43        self.as_ref().validate_contains(needle)
44    }
45}
46
47impl ValidateContains for &str {
48    fn validate_contains(&self, needle: &str) -> bool {
49        self.contains(needle)
50    }
51}
52
53impl<S, H: BuildHasher> ValidateContains for HashMap<String, S, H> {
54    fn validate_contains(&self, needle: &str) -> bool {
55        self.contains_key(needle)
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62
63    #[test]
64    fn test_validate_contains_string() {
65        assert!("hey".validate_contains("e"));
66    }
67
68    #[test]
69    fn test_validate_contains_string_can_fail() {
70        assert!(!"hey".validate_contains("o"));
71    }
72
73    #[test]
74    fn test_validate_contains_hashmap_key() {
75        let mut map = HashMap::new();
76        map.insert("hey".to_string(), 1);
77        assert!(map.validate_contains("hey"));
78    }
79
80    #[test]
81    fn test_validate_contains_hashmap_key_can_fail() {
82        let mut map = HashMap::new();
83        map.insert("hey".to_string(), 1);
84        assert!(!map.validate_contains("bob"));
85    }
86
87    #[test]
88    fn test_validate_contains_cow() {
89        let test: Cow<'static, str> = "hey".into();
90        assert!(test.validate_contains("e"));
91        let test: Cow<'static, str> = String::from("hey").into();
92        assert!(test.validate_contains("e"));
93    }
94
95    #[test]
96    fn test_validate_contains_cow_can_fail() {
97        let test: Cow<'static, str> = "hey".into();
98        assert!(!test.validate_contains("o"));
99        let test: Cow<'static, str> = String::from("hey").into();
100        assert!(!test.validate_contains("o"));
101    }
102}