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}