use regex::Error;
use crate::utils::build_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> {
match build_regex(pattern, case_insensitive) {
Ok(re) => Ok(re.replace_all(self, replacement).to_string()),
Err(error) => Err(error)
}
}
fn pattern_replace_first_result(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Result<String, Error> {
match build_regex(pattern, case_insensitive) {
Ok(re) => Ok(re.replace(self, replacement).to_string()),
Err(error) => Err(error)
}
}
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> {
match build_regex(pattern, case_insensitive) {
Ok(re) => {
let replacements = self.into_iter()
.map(|segment| re.replace_all(segment, replacement).to_string())
.collect::<Vec<String>>();
Ok(replacements)
},
Err(error) => Err(error)
}
}
fn pattern_replace_first_result(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Result<Vec<String>, Error> {
match build_regex(pattern, case_insensitive) {
Ok(re) => {
let replacements = self.into_iter()
.map(|segment| re.replace(segment, replacement).to_string())
.collect::<Vec<String>>();
Ok(replacements)
},
Err(error) => Err(error)
}
}
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())
}
}