rl_lang/parser/statements/
match_statement.rs1use 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}