validator_async/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>
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}