bc-envelope-pattern 0.14.0

Pattern matcher for Gordian Envelope
Documentation
use super::{super::Token, not_parser::parse_not};
use crate::{Pattern, Result};

pub(crate) fn parse_traverse(
    lexer: &mut logos::Lexer<Token>,
) -> Result<Pattern> {
    let mut patterns = vec![parse_not(lexer)?];

    loop {
        let mut lookahead = lexer.clone();
        match lookahead.next() {
            Some(Ok(Token::Traverse)) => {
                lexer.next();
                patterns.push(parse_not(lexer)?);
            }
            _ => break,
        }
    }

    if patterns.len() == 1 {
        Ok(patterns.remove(0))
    } else {
        Ok(Pattern::traverse(patterns))
    }
}