soar_utils/
pattern.rs

1/// Applies the `.sig` variant to a list of patterns.
2///
3/// This function takes a list of patterns and appends the `.sig` variant to
4/// each pattern. If the pattern starts with `!`, the pattern is negated.
5///
6/// # Arguments
7/// * `patterns` - A vector of patterns to apply the `.sig` variant to.
8///
9/// # Returns
10/// A vector of patterns with the `.sig` variant applied.
11///
12/// # Examples
13///
14/// ```
15/// use soar_utils::pattern::apply_sig_variants;
16///
17/// let patterns = vec!["foo", "!bar", "baz"]
18///     .into_iter()
19///     .map(String::from)
20///     .collect();
21/// let sig_variants = apply_sig_variants(patterns);
22///
23/// assert_eq!(sig_variants, vec!["{foo,foo.sig}", "!{bar,bar.sig}", "{baz,baz.sig}"]);
24/// ```
25pub fn apply_sig_variants(patterns: Vec<String>) -> Vec<String> {
26    patterns
27        .into_iter()
28        .map(|pat| {
29            let (negate, inner) = if let Some(rest) = pat.strip_prefix('!') {
30                (true, rest)
31            } else {
32                (false, pat.as_str())
33            };
34
35            let sig_variant = format!("{inner}.sig");
36            let brace_pattern = format!("{{{inner},{sig_variant}}}");
37
38            if negate {
39                format!("!{brace_pattern}")
40            } else {
41                brace_pattern
42            }
43        })
44        .collect()
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50
51    #[test]
52    fn test_apply_sig_variants() {
53        let patterns = vec!["foo", "!bar", "baz"]
54            .into_iter()
55            .map(String::from)
56            .collect();
57        let sig_variants = apply_sig_variants(patterns);
58
59        assert_eq!(
60            sig_variants,
61            vec!["{foo,foo.sig}", "!{bar,bar.sig}", "{baz,baz.sig}"]
62        );
63    }
64}