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