use crate::{PatternMatch, PatternReplace};
pub trait PatternMatchMany where Self:PatternMatch {
fn pattern_match_many(&self, patterns: &[&str], case_insensitive: bool) -> bool {
let mut num_matched:usize = 0;
let num_patterns = patterns.len();
for pattern in patterns {
if self.pattern_match(pattern, case_insensitive) {
num_matched += 1;
}
}
num_matched == num_patterns
}
fn pattern_match_many_mixed(&self, pattern_sets: &[(&str, bool)]) -> bool {
let mut num_matched:usize = 0;
let num_patterns = pattern_sets.len();
for pair in pattern_sets {
let (pattern, case_insensitive) = *pair;
if self.pattern_match(pattern, case_insensitive) {
num_matched += 1;
}
}
num_matched == num_patterns
}
fn pattern_match_many_conditional(&self, pattern_sets: &[(bool, &str, bool)]) -> bool {
let mut num_matched:usize = 0;
let num_patterns = pattern_sets.len();
for pattern_set in pattern_sets {
let (is_positive, pattern, case_insensitive) = *pattern_set;
let is_matched = self.pattern_match(pattern, case_insensitive);
if is_matched == is_positive {
num_matched += 1;
}
}
num_matched == num_patterns
}
fn pattern_match_many_ci(&self, patterns: &[&str]) -> bool {
self.pattern_match_many(patterns, true)
}
fn pattern_match_many_cs(&self, patterns: &[&str]) -> bool {
self.pattern_match_many(patterns, false)
}
fn pattern_match_any(&self, patterns: &[&str], case_insensitive: bool) -> bool {
for pattern in patterns {
if self.pattern_match(pattern, case_insensitive) {
return true;
}
}
false
}
fn pattern_match_any_ci(&self, patterns: &[&str]) -> bool {
self.pattern_match_any(patterns, true)
}
fn pattern_match_any_cs(&self, patterns: &[&str]) -> bool {
self.pattern_match_any(patterns, false)
}
fn pattern_match_any_mixed(&self, pattern_sets: &[(&str, bool)]) -> bool {
for pair in pattern_sets {
let (pattern, case_insensitive) = *pair;
if self.pattern_match(pattern, case_insensitive) {
return true;
}
}
false
}
fn pattern_match_any_conditional(&self, pattern_sets: &[(bool, &str, bool)]) -> bool {
for pattern_set in pattern_sets {
let (is_positive, pattern, case_insensitive) = *pattern_set;
let is_matched = self.pattern_match(pattern, case_insensitive);
if is_matched == is_positive {
return true;
}
}
false
}
}
impl PatternMatchMany for str {
}
impl PatternMatchMany for [String] {
}
pub trait PatternReplaceMany {
fn pattern_replace_pairs(&self, replacement_sets: &[(&str, &str)], case_insensitive: bool) -> Self where Self: Sized;
fn pattern_replace_pairs_ci(&self, replacement_sets: &[(&str, &str)]) -> Self where Self: Sized {
self.pattern_replace_pairs(replacement_sets, true)
}
fn pattern_replace_pairs_cs(&self, replacement_sets: &[(&str, &str)]) -> Self where Self: Sized {
self.pattern_replace_pairs(replacement_sets, false)
}
fn pattern_replace_sets(&self, replacement_sets: &[(&str, &str, bool)]) -> Self where Self: Sized;
}
impl PatternReplaceMany for String {
fn pattern_replace_sets(&self, replacement_sets: &[(&str, &str, bool)]) -> String {
let mut return_string = self.clone();
for replacement_set in replacement_sets {
let (pattern, replacement, case_insensitive) = *replacement_set;
if let Ok(new_string) = return_string.pattern_replace_result(pattern, replacement, case_insensitive) {
return_string = new_string;
}
}
return_string
}
fn pattern_replace_pairs(&self, replacement_pairs: &[(&str, &str)], case_sensitive: bool) -> String {
let mut return_string = self.clone();
for replacement_pair in replacement_pairs {
let (pattern, replacement) = *replacement_pair;
if let Ok(new_string) = return_string.pattern_replace_result(pattern, replacement, case_sensitive) {
return_string = new_string;
}
}
return_string
}
}
impl PatternReplaceMany for Vec<String> {
fn pattern_replace_sets(&self, replacement_sets: &[(&str, &str, bool)]) -> Vec<String> {
let mut return_strings = self.clone();
for replacement_set in replacement_sets {
let (pattern, replacement, case_insensitive) = *replacement_set;
if let Ok(new_strings) = return_strings.pattern_replace_result(pattern, replacement, case_insensitive) {
return_strings = new_strings;
}
}
return_strings
}
fn pattern_replace_pairs(&self, replacement_pairs: &[(&str, &str)], case_insensitive: bool) -> Vec<String> {
let mut return_strings = self.clone();
for replacement_pair in replacement_pairs {
let (pattern, replacement) = *replacement_pair;
if let Ok(new_string) = return_strings.pattern_replace_result(pattern, replacement, case_insensitive) {
return_strings = new_string;
}
}
return_strings
}
}