use regex::Error;
use crate::pattern_cache::with_cached_regex;
use std::borrow::ToOwned;
pub trait PatternReplace where Self:Sized {
fn pattern_replace_result(&self, pattern: &str, replacement: &str,case_insensitive: bool) -> Result<Self, Error> where Self:Sized;
fn pattern_replace_first_result(&self, pattern: &str, replacement: &str,case_insensitive: bool) -> Result<Self, Error> where Self:Sized;
fn pattern_replace(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Self where Self:Sized;
fn pattern_replace_first(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Self where Self:Sized;
fn pattern_replace_ci(&self, pattern: &str, replacement: &str) -> Self where Self:Sized {
self.pattern_replace(pattern, replacement, true)
}
fn pattern_replace_cs(&self, pattern: &str, replacement: &str) -> Self where Self:Sized {
self.pattern_replace(pattern, replacement, false)
}
fn pattern_replace_first_ci(&self, pattern: &str, replacement: &str) -> Self where Self:Sized {
self.pattern_replace_first(pattern, replacement, true)
}
fn pattern_replace_first_cs(&self, pattern: &str, replacement: &str) -> Self where Self:Sized {
self.pattern_replace_first(pattern, replacement, false)
}
}
impl PatternReplace for String {
fn pattern_replace_result(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Result<String, Error> {
with_cached_regex(pattern, case_insensitive, |re| re.replace_all(self, replacement).to_string())
}
fn pattern_replace_first_result(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Result<String, Error> {
with_cached_regex(pattern, case_insensitive, |re| re.replace(self, replacement).to_string())
}
fn pattern_replace(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> String {
self.pattern_replace_result(pattern, replacement, case_insensitive).unwrap_or(self.to_owned())
}
fn pattern_replace_first(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> String {
self.pattern_replace_first_result(pattern, replacement, case_insensitive).unwrap_or(self.to_owned())
}
}
impl PatternReplace for Vec<String> {
fn pattern_replace_result(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Result<Vec<String>, Error> {
with_cached_regex(pattern, case_insensitive, |re| {
self.into_iter()
.map(|segment| re.replace_all(segment, replacement).to_string())
.collect::<Vec<String>>()
})
}
fn pattern_replace_first_result(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Result<Vec<String>, Error> {
with_cached_regex(pattern, case_insensitive, |re| {
self.into_iter()
.map(|segment| re.replace(segment, replacement).to_string())
.collect::<Vec<String>>()
})
}
fn pattern_replace(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Vec<String> {
self.pattern_replace_result(pattern, replacement, case_insensitive).unwrap_or(self.to_owned())
}
fn pattern_replace_first(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Vec<String> {
self.pattern_replace_first_result(pattern, replacement, case_insensitive).unwrap_or(self.to_owned())
}
}