Skip to main content

cargo_plot/core/
patterns_expand.rs

1/// [POL]: Kontekst wzorców - przechowuje oryginalne wzorce użytkownika oraz ich rozwiniętą formę.
2/// [ENG]: Pattern context - stores original user patterns and their tok form.
3#[derive(Debug, Clone)]
4pub struct PatternContext {
5    pub raw: Vec<String>,
6    pub tok: Vec<String>,
7}
8
9impl PatternContext {
10    /// [POL]: Tworzy nowy kontekst, automatycznie rozwijając klamry w podanych wzorcach.
11    /// [ENG]: Creates a new context, automatically expanding braces in the provided patterns.
12    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    /// [POL]: Prywatna metoda: rozwija klamry we wzorcu (np. {a,b} -> [a, b]). Obsługuje rekurencję.
30    /// [ENG]: Private method: expands braces in a pattern (e.g. {a,b} -> [a, b]). Supports recursion.
31    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}