jql_parser/
group.rs

1use crate::tokens::Token;
2
3#[must_use]
4/// Splits a list of `Tokens` by `GroupSeparator`.
5/// Returns groups of `Tokens`.
6pub fn split<'a>(tokens: &'a [Token<'a>]) -> Vec<Vec<&'a Token<'a>>> {
7    tokens
8        .iter()
9        .fold(vec![], |mut acc: Vec<Vec<&Token>>, token| {
10            if token == &Token::GroupSeparator {
11                acc.push(vec![]);
12
13                return acc;
14            }
15
16            if acc.is_empty() {
17                acc.push(vec![]);
18            }
19
20            if let Some(last) = acc.last_mut() {
21                last.push(token);
22            }
23
24            acc
25        })
26        .into_iter()
27        .filter(|group| !group.is_empty())
28        .collect()
29}
30
31#[cfg(test)]
32mod tests {
33
34    use super::split;
35    use crate::tokens::Token;
36
37    #[test]
38    fn check_split() {
39        assert!(split(&[Token::GroupSeparator,]).is_empty());
40        assert_eq!(
41            split(&[Token::KeySelector("abc")]),
42            vec![vec![&Token::KeySelector("abc")]]
43        );
44        assert_eq!(
45            split(&[
46                Token::GroupSeparator,
47                Token::GroupSeparator,
48                Token::KeySelector("abc")
49            ]),
50            vec![vec![&Token::KeySelector("abc")]]
51        );
52        assert_eq!(
53            split(&[
54                Token::KeySelector("abc"),
55                Token::GroupSeparator,
56                Token::KeySelector("abc")
57            ]),
58            vec![
59                vec![&Token::KeySelector("abc")],
60                vec![&Token::KeySelector("abc")],
61            ]
62        );
63    }
64}