validator/validation/
contains.rs1use 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}