zebra_test/command/
to_regex.rs
1use std::{collections::HashSet, iter};
4
5use itertools::Itertools;
6use regex::{Error, Regex, RegexBuilder, RegexSet, RegexSetBuilder};
7
8pub trait ToRegex {
10 fn to_regex(&self) -> Result<Regex, Error>;
14}
15
16impl ToRegex for Regex {
19 fn to_regex(&self) -> Result<Regex, Error> {
20 Ok(self.clone())
21 }
22}
23
24impl ToRegex for &Regex {
25 fn to_regex(&self) -> Result<Regex, Error> {
26 Ok((*self).clone())
27 }
28}
29
30impl ToRegex for RegexBuilder {
33 fn to_regex(&self) -> Result<Regex, Error> {
34 self.build()
35 }
36}
37
38impl ToRegex for &RegexBuilder {
39 fn to_regex(&self) -> Result<Regex, Error> {
40 self.build()
41 }
42}
43
44impl ToRegex for String {
47 fn to_regex(&self) -> Result<Regex, Error> {
48 Regex::new(self)
49 }
50}
51
52impl ToRegex for &String {
53 fn to_regex(&self) -> Result<Regex, Error> {
54 Regex::new(self)
55 }
56}
57
58impl ToRegex for &str {
59 fn to_regex(&self) -> Result<Regex, Error> {
60 Regex::new(self)
61 }
62}
63
64pub trait ToRegexSet {
66 fn to_regex_set(&self) -> Result<RegexSet, Error>;
74}
75
76impl ToRegexSet for RegexSet {
79 fn to_regex_set(&self) -> Result<RegexSet, Error> {
80 Ok(self.clone())
81 }
82}
83
84impl ToRegexSet for &RegexSet {
85 fn to_regex_set(&self) -> Result<RegexSet, Error> {
86 Ok((*self).clone())
87 }
88}
89
90impl ToRegexSet for RegexSetBuilder {
93 fn to_regex_set(&self) -> Result<RegexSet, Error> {
94 self.build()
95 }
96}
97
98impl ToRegexSet for &RegexSetBuilder {
99 fn to_regex_set(&self) -> Result<RegexSet, Error> {
100 self.build()
101 }
102}
103
104impl<T> ToRegexSet for T
107where
108 T: ToRegex,
109{
110 fn to_regex_set(&self) -> Result<RegexSet, Error> {
111 let regex = self.to_regex()?;
112
113 let regex = regex.as_str();
115
116 RegexSet::new(iter::once(regex))
117 }
118}
119
120pub trait CollectRegexSet {
122 fn collect_regex_set(self) -> Result<RegexSet, Error>;
132}
133
134impl<I> CollectRegexSet for I
137where
138 I: IntoIterator,
139 I::Item: ToRegexSet,
140{
141 fn collect_regex_set(self) -> Result<RegexSet, Error> {
142 let regexes: Result<Vec<RegexSet>, Error> = self
143 .into_iter()
144 .map(|item| item.to_regex_set())
145 .try_collect();
146 let regexes = regexes?;
147
148 let regexes = regexes.iter().flat_map(|regex_set| regex_set.patterns());
150
151 RegexSet::new(regexes)
152 }
153}
154
155pub trait RegexSetExt {
157 fn patterns_for_indexes(&self, indexes: &HashSet<usize>) -> Vec<String>;
159}
160
161impl RegexSetExt for RegexSet {
162 fn patterns_for_indexes(&self, indexes: &HashSet<usize>) -> Vec<String> {
163 self.patterns()
164 .iter()
165 .enumerate()
166 .filter(|(index, _regex)| indexes.contains(index))
167 .map(|(_index, regex)| regex.to_string())
168 .collect()
169 }
170}