metadata_filter/
filters.rs1use std::borrow::Cow;
4
5use crate::rules::FilterRule;
6
7fn apply_once(text: String, rules: &[FilterRule]) -> String {
8 rules.iter().fold(text, |mut result, rule| {
9 let filtered = rule.apply(&result);
10 if let Cow::Owned(filtered) = filtered {
11 result.clear();
12 result.push_str(&filtered);
13 }
14 result
15 })
16}
17
18pub fn apply_rules(text: &str, rules: &[FilterRule]) -> String {
20 let mut prev = text.to_string();
21 let mut result = apply_once(text.to_string(), rules);
22 while result != prev {
23 prev.clear();
24 prev.push_str(&result);
25 result = apply_once(result, rules);
26 }
27 result
28}
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33 use crate::rules::*;
34
35 #[test]
36 fn test_multiple_rulesets() {
37 let rules = [remastered_filter_rules(), trim_whitespace_filter_rules()].concat();
38 let filtered = apply_rules("Here Comes The Sun (Remastered)", &rules);
39
40 assert_eq!(filtered, "Here Comes The Sun");
41 }
42}