diff --git a/src/parser.rs b/src/parser.rs index 4186d54..483a29c 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -39,15 +39,13 @@ fn parse_list(tokens: &mut Vec) -> Result { } let mut list: Vec = Vec::new(); - while !tokens.is_empty() { - let token = tokens.pop(); - if token == None { + loop { + let Some(token) = tokens.pop() else { return Err(ParseError { - err: format!("Did not find enough tokens"), + err: format!("Expected RParen or next list element, but ran out of tokens!"), }); - } - let t = token.unwrap(); - match t { + }; + match token { Token::Keyword(k) => list.push(Object::Keyword(k)), Token::If => list.push(Object::If), Token::BinaryOp(b) => list.push(Object::BinaryOp(b)), @@ -65,14 +63,18 @@ fn parse_list(tokens: &mut Vec) -> Result { } } } - - Ok(Object::List(Rc::new(list))) } #[cfg(test)] mod tests { use super::*; + #[test] + fn incomplete_list() { + parse_list(&mut vec![Token::LParen, Token::Integer(5)]) + .expect_err("List is missing RParen"); + } + #[test] fn test_add() { let list = parse("(+ 1 2)").unwrap();