metadata_filter/
filters.rs

1//! Functionality to filter artist, album and song names.
2
3use 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
18/// Apply a list of filter rules until the result doesn't change anymore.
19pub 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}