string_patterns/
pattern_replace.rs1use regex::Error;
2use crate::utils::build_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 match build_regex(pattern, case_insensitive) {
60 Ok(re) => Ok(re.replace_all(self, replacement).to_string()),
61 Err(error) => Err(error)
62 }
63 }
64
65 fn pattern_replace_first_result(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Result<String, Error> {
67 match build_regex(pattern, case_insensitive) {
68 Ok(re) => Ok(re.replace(self, replacement).to_string()),
69 Err(error) => Err(error)
70 }
71 }
72
73 fn pattern_replace(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> String {
75 self.pattern_replace_result(pattern, replacement, case_insensitive).unwrap_or(self.to_owned())
76 }
77
78 fn pattern_replace_first(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> String {
80 self.pattern_replace_first_result(pattern, replacement, case_insensitive).unwrap_or(self.to_owned())
81 }
82
83}
84
85impl PatternReplace for Vec<String> {
87 fn pattern_replace_result(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Result<Vec<String>, Error> {
91 match build_regex(pattern, case_insensitive) {
92 Ok(re) => {
93 let replacements = self.into_iter()
94 .map(|segment| re.replace_all(segment, replacement).to_string())
95 .collect::<Vec<String>>();
96 Ok(replacements)
97 },
98 Err(error) => Err(error)
99 }
100 }
101
102 fn pattern_replace_first_result(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Result<Vec<String>, Error> {
106 match build_regex(pattern, case_insensitive) {
107 Ok(re) => {
108 let replacements = self.into_iter()
109 .map(|segment| re.replace(segment, replacement).to_string())
110 .collect::<Vec<String>>();
111 Ok(replacements)
112 },
113 Err(error) => Err(error)
114 }
115 }
116
117 fn pattern_replace(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Vec<String> {
119 self.pattern_replace_result(pattern, replacement, case_insensitive).unwrap_or(self.to_owned())
120 }
121
122 fn pattern_replace_first(&self, pattern: &str, replacement: &str, case_insensitive: bool) -> Vec<String> {
124 self.pattern_replace_first_result(pattern, replacement, case_insensitive).unwrap_or(self.to_owned())
125 }
126
127}