use crate::ast; fn parse_expr(tokens: &mut Vec) -> Result { todo!() } enum Error { UnexpectedToken(LocatedToken), UnexpectedEndOfInput, } fn parse_definition(tokens: &mut Vec) -> Result { if let Some(start) = tokens.pop_if(|tok| tok.token == Token::Let) { if let Some(LocatedToken { token: Token::Identifier(identifier), .. }) = tokens.pop_if(|tok| match tok.token { Token::Identifier(_) => true, _ => false, }) { if let Some(_eq) = tokens.pop_if(|tok| tok.token == Token::Equals) { let expr = parse_expr(tokens)?; Ok(ast::Definition { name: ast::Name(identifier), expr, }) } else { Err(Error::UnexpectedToken(start)) } } else { Err(Error::UnexpectedToken(start)) } } else { Err(Error::UnexpectedEndOfInput) } }