use crate::{build_regex, utils::build_whole_word_pattern};
pub trait PatternFilter<'a, T> where T:Sized {
fn pattern_filter(&'a self, pattern: &str, case_insensitive: bool) -> Vec<T>;
fn pattern_filter_ci(&'a self, pattern: &str) -> Vec<T> {
self.pattern_filter(pattern, true)
}
fn pattern_filter_cs(&'a self, pattern: &str) -> Vec<T> {
self.pattern_filter(pattern, false)
}
fn pattern_filter_word(&'a self, pattern: &str, case_insensitive: bool) -> Vec<T> {
let word_pattern = build_whole_word_pattern(pattern);
self.pattern_filter(&word_pattern, case_insensitive)
}
fn pattern_filter_word_ci(&'a self, pattern: &str) -> Vec<T> {
self.pattern_filter_word(pattern, true)
}
fn pattern_filter_word_cs(&'a self, pattern: &str) -> Vec<T> {
self.pattern_filter_word(pattern, false)
}
}
impl<'a> PatternFilter<'a, String> for [String] {
fn pattern_filter(&'a self, pattern: &str, case_insensitive: bool) -> Vec<String> {
if let Ok(re) = build_regex(pattern, case_insensitive) {
self.into_iter().filter(|s| re.is_match(s)).map(|s| s.to_owned()).collect::<Vec<String>>()
} else {
self.to_owned()
}
}
}
impl<'a> PatternFilter<'a, &'a str> for [&str] {
fn pattern_filter(&'a self, pattern: &str, case_insensitive: bool) -> Vec<&str> {
if let Ok(re) = build_regex(pattern, case_insensitive) {
self.into_iter().filter(|s| re.is_match(s)).map(|s| s.to_owned()).collect::<Vec<&str>>()
} else {
self.into_iter().map(|s| s.to_owned()).collect::<Vec<&str>>()
}
}
}