diff --git a/src/settings/mod.rs b/src/settings/mod.rs index c29f780..1b6c02e 100644 --- a/src/settings/mod.rs +++ b/src/settings/mod.rs @@ -284,32 +284,36 @@ impl Settings { RULESET_CURRENT_VERSION.to_string() } - // TODO make the return type a Result - fn update_rules(&self) -> Vec<(Regex, String)> { + fn update_rules(&self) -> std::result::Result, String> { let mut rules = self.rules.clone(); - // TODO Optimize that shit // TODO break categories in different rules - for (category, content) in &self.categories { - let mut temp_rules: Vec<(Regex, String)> = Vec::new(); - for (from, to) in &rules { - let from = Regex::new( - from.to_string() - .replace( + for (from, to) in rules.iter_mut() { + let re = Regex::new("%\\D"); + let from_match = re.is_match(from.as_str()); + let to_match = re.is_match(to); + if from_match || to_match { + for (category, content) in &self.categories { + if from_match { + *from = Regex::new( + from.to_string() + .replace( + format!("%{}", category).as_str(), + format!("[{}]", content).as_str(), + ) + .as_str() + ); + } + if to_match { + *to = to.to_string().replace( format!("%{}", category).as_str(), - format!("[{}]", content).as_str(), - ) - .as_str(), - ); - let to = to.to_string().replace( - format!("%{}", category).as_str(), - format!("[{}]", content).as_str(), - ); - temp_rules.push((from, to)); + format!("[{}]", content).as_str() + ); + } + } } - rules = temp_rules.clone(); } - rules + Ok(rules) } /// Apply list of rules to input @@ -337,7 +341,8 @@ impl Settings { /// let _output = settings.apply(input); /// ``` pub fn apply(&self, s: String) -> std::result::Result { - let rules = self.update_rules(); + // TODO Add Error handling + let rules = self.update_rules().unwrap(); let mut s = s.clone(); debug!("==============================================="); for (from, to) in rules {