string_patterns/
pattern_match.rs1use regex::Error;
2use crate::utils::build_regex;
3
4pub trait PatternMatch {
6 fn pattern_match_result(&self, pattern: &str, case_insensitive: bool) -> Result<bool, Error>;
9
10 fn pattern_match(&self, pattern: &str, case_insensitive: bool) -> bool {
13 if let Ok(matched) = self.pattern_match_result(pattern, case_insensitive){
14 matched
15 } else {
16 false
17 }
18 }
19
20 fn pattern_match_ci(&self, pattern: &str) -> bool {
22 self.pattern_match(pattern, true)
23 }
24
25 fn pattern_match_cs(&self, pattern: &str) -> bool {
28 self.pattern_match(pattern, false)
29 }
30
31}
32
33impl PatternMatch for str {
35
36 fn pattern_match_result(&self, pattern: &str, case_insensitive: bool) -> Result<bool, Error> {
43 match build_regex(pattern, case_insensitive) {
44 Ok(re) => Ok(re.is_match(self)),
45 Err(error) => Err(error)
46 }
47 }
48}
49
50impl PatternMatch for [&str] {
52 fn pattern_match_result(&self, pattern: &str, case_insensitive: bool) -> Result<bool, Error> {
54 match build_regex(pattern, case_insensitive) {
55 Ok(re) => Ok(self.into_iter().any(|segment| re.is_match(*segment))),
56 Err(error) => Err(error)
57 }
58 }
59}
60
61impl PatternMatch for [String] {
63 fn pattern_match_result(&self, pattern: &str, case_insensitive: bool) -> Result<bool, Error> {
65 match build_regex(pattern, case_insensitive) {
66 Ok(re) => Ok(self.into_iter().any(|segment| re.is_match(segment))),
67 Err(error) => Err(error)
68 }
69 }
70}
71
72pub trait PatternMatches {
74
75 fn pattern_matched_pairs_result(&self, pattern: &str, case_insensitive: bool) -> Result<Vec<(bool, &str)>, Error>;
79
80
81 fn pattern_matched_pairs_default(&self) -> Vec<(bool, &str)>;
84
85 fn pattern_matched_pairs(&self, pattern: &str, case_insensitive: bool) -> Vec<(bool, &str)> {
89 match self.pattern_matched_pairs_result(pattern, case_insensitive) {
90 Ok(results) => results,
91 Err(_error) => self.pattern_matched_pairs_default()
92 }
93 }
94
95 fn pattern_matches_result(&self, pattern: &str, case_insensitive: bool) -> Result<Vec<bool>, Error> {
98 match self.pattern_matched_pairs_result(pattern, case_insensitive) {
99 Ok(items) => Ok(items.into_iter().map(|(result, _item)| result).collect::<Vec<bool>>()),
100 Err(error) => Err(error)
101 }
102 }
103
104 fn pattern_matches_filtered(&self, pattern: &str, case_insensitive: bool) -> Vec<&str> {
106 self.pattern_matched_pairs(pattern, case_insensitive).into_iter().filter(|(is_matched, _item)| *is_matched).map(|(_is_matched, item)| item).collect()
107 }
108
109 fn pattern_matches_filtered_ci(&self, pattern: &str) -> Vec<&str> {
111 self.pattern_matched_pairs(pattern, true).into_iter().filter(|(is_matched, _item)| *is_matched).map(|(_is_matched, item)| item).collect()
112 }
113
114 fn pattern_matches_filtered_cs(&self, pattern: &str) -> Vec<&str> {
116 self.pattern_matched_pairs(pattern, false).into_iter().filter(|(is_matched, _item)| *is_matched).map(|(_is_matched, item)| item).collect()
117 }
118
119
120 fn pattern_matches(&self, pattern: &str, case_insensitive: bool) -> Vec<bool> {
123 self.pattern_matched_pairs(pattern, case_insensitive).into_iter().map(|(matched, _item)| matched).collect()
124 }
125
126 fn pattern_matches_ci(&self, pattern: &str) -> Vec<bool> {
128 self.pattern_matches(pattern, true)
129 }
130
131 fn pattern_matches_cs(&self, pattern: &str) -> Vec<bool> {
133 self.pattern_matches(pattern, false)
134 }
135}
136
137impl PatternMatches for [&str] {
139
140 fn pattern_matched_pairs_result(&self, pattern: &str, case_insensitive: bool) -> Result<Vec<(bool, &str)>, Error> {
143 match build_regex(pattern, case_insensitive) {
144 Ok(re) => Ok(self.into_iter().map(|segment| (re.is_match(*segment), *segment)).collect::<Vec<(bool, &str)>>()),
145 Err(error) => Err(error)
146 }
147 }
148
149 fn pattern_matched_pairs_default(&self) -> Vec<(bool, &str)> {
151 self.into_iter().map(|item| (false, *item)).collect()
152 }
153
154}
155
156impl PatternMatches for [String] {
160
161 fn pattern_matched_pairs_result(&self, pattern: &str, case_insensitive: bool) -> Result<Vec<(bool, &str)>, Error> {
164 match build_regex(pattern, case_insensitive) {
165 Ok(re) => Ok(self.into_iter().map(|segment| (re.is_match(segment), segment.as_str())).collect::<Vec<(bool, &str)>>()),
166 Err(error) => Err(error)
167 }
168 }
169
170 fn pattern_matched_pairs_default(&self) -> Vec<(bool, &str)> {
172 self.into_iter().map(|item| (false, item.as_str())).collect()
173 }
174
175}