Skip to main content

rl_lang/parser/statements/
match_statement.rs

1//! match statement parser.
2
3use crate::{
4    ast::statements::{MatchPattern, Statement, StatementKind},
5    lexer::tokentypes::TokenType,
6    parser::parser_logic::Parser,
7    utils::{errors::Error, span::Span},
8};
9
10impl Parser {
11    pub fn parse_match(&mut self, start: Span) -> Result<Statement, Error> {
12        while self.match_type(&[TokenType::Newline]) {}
13        let value = self.parse_expression()?;
14
15        while self.match_type(&[TokenType::Newline]) {}
16        if !self.match_type(&[TokenType::LeftBrace]) {
17            return Err(self.err("expected { after match value", self.peek_span()));
18        }
19
20        let mut arms: Vec<(MatchPattern, Vec<Statement>)> = Vec::new();
21
22        while !self.match_type(&[TokenType::RightBrace, TokenType::Eof]) {
23            while self.match_type(&[TokenType::Newline]) {}
24            if self.peek() == TokenType::RightBrace || self.peek() == TokenType::Eof {
25                break;
26            }
27
28            let pattern = if self.match_type(&[TokenType::Wildcard]) {
29                MatchPattern::Wildcard
30            } else {
31                MatchPattern::Literal(self.parse_expression()?)
32            };
33
34            while self.match_type(&[TokenType::Newline]) {}
35            if !self.match_type(&[TokenType::FatArrow]) {
36                return Err(self.err("expected => after match pattern", self.peek_span()));
37            }
38
39            let body = self.parse_block()?;
40            while self.match_type(&[TokenType::Newline]) {}
41            arms.push((pattern, body));
42        }
43
44        let span = start.join(self.previous_span());
45        Ok(Statement::new(StatementKind::Match { value, arms }, span))
46    }
47}