string_patterns/
pattern_replace.rs1use regex::Error;
2use crate::pattern_cache::with_cached_regex;
3use std::borrow::ToOwned;
4
5pub trait PatternReplace where Self:Sized {
7
8 fn pattern_replace_result(&self, pattern: &str, replacement: &str,case_insensitive: bool) -> Result<Self, Error> where Self:Sized;
12
13 fn pattern_replace_first_result(&self, pattern: &str, replacement: &str,case_insensitive: bool) -> Result<Self, Error> where Self:Sized;
17
18 fn pattern_replace(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Self where Self:Sized;
21
22
23 fn pattern_replace_first(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Self where Self:Sized;
26
27
28 fn pattern_replace_ci(&self, pattern: &str, replacement: &str) -> Self where Self:Sized {
31 self.pattern_replace(pattern, replacement, true)
32 }
33
34 fn pattern_replace_cs(&self, pattern: &str, replacement: &str) -> Self where Self:Sized {
37 self.pattern_replace(pattern, replacement, false)
38 }
39
40 fn pattern_replace_first_ci(&self, pattern: &str, replacement: &str) -> Self where Self:Sized {
43 self.pattern_replace_first(pattern, replacement, true)
44 }
45
46 fn pattern_replace_first_cs(&self, pattern: &str, replacement: &str) -> Self where Self:Sized {
49 self.pattern_replace_first(pattern, replacement, false)
50 }
51
52}
53
54impl PatternReplace for String {
56
57 fn pattern_replace_result(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Result<String, Error> {
59 with_cached_regex(pattern, case_insensitive, |re| re.replace_all(self, replacement).to_string())
60 }
61
62 fn pattern_replace_first_result(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Result<String, Error> {
64 with_cached_regex(pattern, case_insensitive, |re| re.replace(self, replacement).to_string())
65 }
66
67 fn pattern_replace(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> String {
69 self.pattern_replace_result(pattern, replacement, case_insensitive).unwrap_or(self.to_owned())
70 }
71
72 fn pattern_replace_first(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> String {
74 self.pattern_replace_first_result(pattern, replacement, case_insensitive).unwrap_or(self.to_owned())
75 }
76
77}
78
79impl PatternReplace for Vec<String> {
81 fn pattern_replace_result(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Result<Vec<String>, Error> {
85 with_cached_regex(pattern, case_insensitive, |re| {
86 self.into_iter()
87 .map(|segment| re.replace_all(segment, replacement).to_string())
88 .collect::<Vec<String>>()
89 })
90 }
91
92 fn pattern_replace_first_result(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Result<Vec<String>, Error> {
96 with_cached_regex(pattern, case_insensitive, |re| {
97 self.into_iter()
98 .map(|segment| re.replace(segment, replacement).to_string())
99 .collect::<Vec<String>>()
100 })
101 }
102
103 fn pattern_replace(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Vec<String> {
105 self.pattern_replace_result(pattern, replacement, case_insensitive).unwrap_or(self.to_owned())
106 }
107
108 fn pattern_replace_first(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Vec<String> {
110 self.pattern_replace_first_result(pattern, replacement, case_insensitive).unwrap_or(self.to_owned())
111 }
112
113}