string_patterns/
pattern_filter.rs1use crate::{build_regex, utils::build_whole_word_pattern};
2
3pub trait PatternFilter<'a, T> where T:Sized {
8 fn pattern_filter(&'a self, pattern: &str, case_insensitive: bool) -> Vec<T>;
10
11 fn pattern_filter_ci(&'a self, pattern: &str) -> Vec<T> {
13 self.pattern_filter(pattern, true)
14 }
15
16 fn pattern_filter_cs(&'a self, pattern: &str) -> Vec<T> {
18 self.pattern_filter(pattern, false)
19 }
20
21 fn pattern_filter_word(&'a self, pattern: &str, case_insensitive: bool) -> Vec<T> {
23 let word_pattern = build_whole_word_pattern(pattern);
24 self.pattern_filter(&word_pattern, case_insensitive)
25 }
26
27 fn pattern_filter_word_ci(&'a self, pattern: &str) -> Vec<T> {
29 self.pattern_filter_word(pattern, true)
30 }
31
32 fn pattern_filter_word_cs(&'a self, pattern: &str) -> Vec<T> {
34 self.pattern_filter_word(pattern, false)
35 }
36}
37
38impl<'a> PatternFilter<'a, String> for [String] {
39 fn pattern_filter(&'a self, pattern: &str, case_insensitive: bool) -> Vec<String> {
41 if let Ok(re) = build_regex(pattern, case_insensitive) {
42 self.into_iter().filter(|s| re.is_match(s)).map(|s| s.to_owned()).collect::<Vec<String>>()
43 } else {
44 self.to_owned()
45 }
46 }
47}
48
49impl<'a> PatternFilter<'a, &'a str> for [&str] {
50 fn pattern_filter(&'a self, pattern: &str, case_insensitive: bool) -> Vec<&str> {
52 if let Ok(re) = build_regex(pattern, case_insensitive) {
53 self.into_iter().filter(|s| re.is_match(s)).map(|s| s.to_owned()).collect::<Vec<&str>>()
54 } else {
55 self.into_iter().map(|s| s.to_owned()).collect::<Vec<&str>>()
56 }
57 }
58}