protospec-build 0.3.0

One binary format language to rule them all, One binary format language to find them, One binary format language to bring them all and in the darkness bind them.
Documentation
use super::*;

pub fn parse_condition_and_transform(
    t: &mut TokenIter,
) -> ParseResult<(Vec<Ident>, Option<Box<Expression>>, Vec<Transform>)> {
    let flags = parse_flags(t)?;

    let condition = parse_conditional_clause(t)?;

    let mut transforms = vec![];

    while t.eat(Token::Arrow).is_some() {
        let name = t.expect_ident()?;
        let mut span = name.span;
        let mut arguments = vec![];
        if t.eat(Token::LeftParen).is_some() {
            loop {
                if let Some(token) = t.eat(Token::RightParen) {
                    span = span + token.span;
                    break;
                }
                arguments.push(parse_expression(t)?);
                if t.eat(Token::Comma).is_none() {
                    span = span + t.expect(Token::RightParen)?;
                    break;
                }
            }
        }
        let conditional = parse_conditional_clause(t)?;
        if let Some(conditional) = &conditional {
            span = span + *conditional.span();
        }
        transforms.push(Transform {
            span,
            arguments,
            name,
            conditional,
        });
    }

    Ok((flags, condition, transforms))
}