From 50be7ca556ee15a1b934bc4899be35824be23af7 Mon Sep 17 00:00:00 2001 From: Erin Date: Thu, 29 Jul 2021 18:58:11 +0200 Subject: [PATCH] Added cart parsing --- src/parser.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/parser.rs b/src/parser.rs index 45d4dfd..978ca6a 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -234,6 +234,43 @@ impl<'source> Parser<'source> { /// Flow for creating carts fn cart_flow(&mut self) -> Result { let mut cart = vec![]; + let mut buf = None; + + match self.checked_next()? { + Token::RightBracket => return Ok(ExprKind::Cart(cart)), + t => buf = Some(self.parse_expr(t, &mut buf)?), + } + + 'cart: loop { + let value = loop { + match self.checked_next()? { + Token::Arrow => break buf.take(), + t => buf = Some(self.parse_expr(t, &mut buf)?), + } + } + .ok_or_else(|| { + Error::new(ErrorKind::UnexpectedToken(Token::Arrow), self.lexer.span()) + })?; + + let key = loop { + match self.checked_next()? { + Token::RightBracket => { + cart.push(( + value, + buf.take() + .ok_or_else(|| Error::unexpected_eof(self.lexer.span().start))?, + )); + + break 'cart; + } + Token::Comma => break buf.take(), + t => buf = Some(self.parse_expr(t, &mut buf)?), + } + } + .ok_or_else(|| Error::unexpected_eof(self.lexer.span().start))?; + + cart.push((value, key)); + } Ok(ExprKind::Cart(cart)) }