cargo_plot/core/
patterns_expand.rs1#[derive(Debug, Clone)]
4pub struct PatternContext {
5 pub raw: Vec<String>,
6 pub tok: Vec<String>,
7}
8
9impl PatternContext {
10 pub fn new<I, S>(patterns: I) -> Self
13 where
14 I: IntoIterator<Item = S>,
15 S: AsRef<str>,
16 {
17 let mut raw = Vec::new();
18 let mut tok = Vec::new();
19
20 for pat in patterns {
21 let pat_str = pat.as_ref();
22 raw.push(pat_str.to_string());
23 tok.extend(Self::expand_braces(pat_str));
24 }
25
26 Self { raw, tok }
27 }
28
29 fn expand_braces(pattern: &str) -> Vec<String> {
32 if let (Some(start), Some(end)) = (pattern.find('{'), pattern.find('}'))
33 && start < end
34 {
35 let prefix = &pattern[..start];
36 let suffix = &pattern[end + 1..];
37 let options = &pattern[start + 1..end];
38
39 let mut tok = Vec::new();
40 for opt in options.split(',') {
41 let new_pattern = format!("{}{}{}", prefix, opt, suffix);
42 tok.extend(Self::expand_braces(&new_pattern));
43 }
44 return tok;
45 }
46 vec![pattern.to_string()]
47 }
48}