magc 0.8.0

The Mag Language Compiler
Documentation
//! Parse a single pattern enclosed in parentheses.

use crate::parser::{Parser, ParserError, ParserResult, PrefixParselet};

use crate::types::{Expression, ExpressionKind, Pattern, Token, TokenKind, TuplePattern};

/// Parse a single pattern enclosed in parentheses.
pub struct TuplePatternParselet;

impl TuplePatternParselet {
    fn expect_pattern(&self, expression: Expression) -> Result<Pattern, ParserError> {
        match expression.kind {
            ExpressionKind::Pattern(pattern) => Ok(pattern),

            _ => Err(ParserError::ExpectedPattern),
        }
    }
}

impl PrefixParselet for TuplePatternParselet {
    fn parse(&self, parser: &mut Parser, token: Token) -> ParserResult {
        let child = Box::new(self.expect_pattern(parser.parse_expression(0)?)?);
        parser.consume_expect(TokenKind::RightParen)?;

        Ok(Expression {
            kind: ExpressionKind::Pattern(Pattern::Tuple(TuplePattern { child })),

            start_pos: token.start_pos,
            end_pos: token.end_pos,
        })
    }
}