tera/renderer/
square_brackets.rs

1/// Return a Vec of all substrings contained in '[ ]'s
2/// Ignore quoted strings and integers.
3pub fn pull_out_square_bracket(s: &str) -> Vec<String> {
4    let mut chars = s.chars();
5    let mut results = vec![];
6    loop {
7        match chars.next() {
8            Some('[') => {
9                let c = chars.next().unwrap();
10                if c != '"' && c != '\'' {
11                    let mut inside_bracket = vec![c];
12                    let mut bracket_count = 1;
13                    loop {
14                        let c = chars.next();
15                        match c {
16                            Some(']') => bracket_count -= 1,
17                            Some('[') => bracket_count += 1,
18                            Some(_) => (),
19                            None => break,
20                        };
21                        if bracket_count == 0 {
22                            // Only store results which aren't numbers
23                            let sub: String = inside_bracket.into_iter().collect();
24                            if sub.parse::<usize>().is_err() {
25                                results.push(sub);
26                            }
27                            break;
28                        }
29                        inside_bracket.push(c.unwrap());
30                    }
31                }
32            }
33            None => break,
34            _ => (),
35        }
36    }
37    results
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn can_pull_out_square_bracket() {
46        assert_eq!(pull_out_square_bracket("hi"), Vec::<String>::new());
47        assert_eq!(pull_out_square_bracket("['hi']"), Vec::<String>::new());
48        assert_eq!(pull_out_square_bracket("[hi] a[0]"), vec!["hi"]);
49        assert_eq!(pull_out_square_bracket("hi [th[e]['r']e] [fish]"), vec!["th[e]['r']e", "fish"]);
50    }
51}