use regex::Error;
use crate::utils::build_regex;
pub trait PatternMatch {
fn pattern_match_result(&self, pattern: &str, case_insensitive: bool) -> Result<bool, Error>;
fn pattern_match(&self, pattern: &str, case_insensitive: bool) -> bool {
if let Ok(matched) = self.pattern_match_result(pattern, case_insensitive){
matched
} else {
false
}
}
fn pattern_match_ci(&self, pattern: &str) -> bool {
self.pattern_match(pattern, true)
}
fn pattern_match_cs(&self, pattern: &str) -> bool {
self.pattern_match(pattern, false)
}
}
impl PatternMatch for str {
fn pattern_match_result(&self, pattern: &str, case_insensitive: bool) -> Result<bool, Error> {
match build_regex(pattern, case_insensitive) {
Ok(re) => Ok(re.is_match(self)),
Err(error) => Err(error)
}
}
}
impl PatternMatch for [&str] {
fn pattern_match_result(&self, pattern: &str, case_insensitive: bool) -> Result<bool, Error> {
match build_regex(pattern, case_insensitive) {
Ok(re) => Ok(self.into_iter().any(|segment| re.is_match(*segment))),
Err(error) => Err(error)
}
}
}
impl PatternMatch for [String] {
fn pattern_match_result(&self, pattern: &str, case_insensitive: bool) -> Result<bool, Error> {
match build_regex(pattern, case_insensitive) {
Ok(re) => Ok(self.into_iter().any(|segment| re.is_match(segment))),
Err(error) => Err(error)
}
}
}
pub trait PatternMatches {
fn pattern_matched_pairs_result(&self, pattern: &str, case_insensitive: bool) -> Result<Vec<(bool, &str)>, Error>;
fn pattern_matched_pairs_default(&self) -> Vec<(bool, &str)>;
fn pattern_matched_pairs(&self, pattern: &str, case_insensitive: bool) -> Vec<(bool, &str)> {
match self.pattern_matched_pairs_result(pattern, case_insensitive) {
Ok(results) => results,
Err(_error) => self.pattern_matched_pairs_default()
}
}
fn pattern_matches_result(&self, pattern: &str, case_insensitive: bool) -> Result<Vec<bool>, Error> {
match self.pattern_matched_pairs_result(pattern, case_insensitive) {
Ok(items) => Ok(items.into_iter().map(|(result, _item)| result).collect::<Vec<bool>>()),
Err(error) => Err(error)
}
}
fn pattern_matches_filtered(&self, pattern: &str, case_insensitive: bool) -> Vec<&str> {
self.pattern_matched_pairs(pattern, case_insensitive).into_iter().filter(|(is_matched, _item)| *is_matched).map(|(_is_matched, item)| item).collect()
}
fn pattern_matches_filtered_ci(&self, pattern: &str) -> Vec<&str> {
self.pattern_matched_pairs(pattern, true).into_iter().filter(|(is_matched, _item)| *is_matched).map(|(_is_matched, item)| item).collect()
}
fn pattern_matches_filtered_cs(&self, pattern: &str) -> Vec<&str> {
self.pattern_matched_pairs(pattern, false).into_iter().filter(|(is_matched, _item)| *is_matched).map(|(_is_matched, item)| item).collect()
}
fn pattern_matches(&self, pattern: &str, case_insensitive: bool) -> Vec<bool> {
self.pattern_matched_pairs(pattern, case_insensitive).into_iter().map(|(matched, _item)| matched).collect()
}
fn pattern_matches_ci(&self, pattern: &str) -> Vec<bool> {
self.pattern_matches(pattern, true)
}
fn pattern_matches_cs(&self, pattern: &str) -> Vec<bool> {
self.pattern_matches(pattern, false)
}
}
impl PatternMatches for [&str] {
fn pattern_matched_pairs_result(&self, pattern: &str, case_insensitive: bool) -> Result<Vec<(bool, &str)>, Error> {
match build_regex(pattern, case_insensitive) {
Ok(re) => Ok(self.into_iter().map(|segment| (re.is_match(*segment), *segment)).collect::<Vec<(bool, &str)>>()),
Err(error) => Err(error)
}
}
fn pattern_matched_pairs_default(&self) -> Vec<(bool, &str)> {
self.into_iter().map(|item| (false, *item)).collect()
}
}
impl PatternMatches for [String] {
fn pattern_matched_pairs_result(&self, pattern: &str, case_insensitive: bool) -> Result<Vec<(bool, &str)>, Error> {
match build_regex(pattern, case_insensitive) {
Ok(re) => Ok(self.into_iter().map(|segment| (re.is_match(segment), segment.as_str())).collect::<Vec<(bool, &str)>>()),
Err(error) => Err(error)
}
}
fn pattern_matched_pairs_default(&self) -> Vec<(bool, &str)> {
self.into_iter().map(|item| (false, item.as_str())).collect()
}
}