magc 0.8.0

The Mag Language Compiler
Documentation
use crate::parser::{Parser, ParserResult, PrefixParselet};
use crate::types::{Conditional, Expression, ExpressionKind, Keyword, Token, TokenKind};

#[derive(Debug, Clone)]
/// Parse a conditional expression like `if condition then {expression} else {expression}`
pub struct ConditionalParselet;

impl PrefixParselet for ConditionalParselet {
    fn parse(&self, parser: &mut Parser, _token: Token) -> ParserResult {
        let condition = Box::new(parser.parse_expression(0)?);
        parser.consume_expect(TokenKind::Keyword(Keyword::Then))?;
        let then_arm = Box::new(parser.parse_expression(0)?);

        if !parser.eof() {
            if let TokenKind::Keyword(Keyword::Else) = parser.peek()?.kind {
                parser.advance();

                let else_arm = Box::new(parser.parse_expression(0)?);
                parser.consume_expect(TokenKind::Keyword(Keyword::End))?;

                Ok(Expression {
                    kind: ExpressionKind::Conditional(Conditional {
                        condition,
                        then_arm,
                        else_arm: Some(else_arm),
                    }),
                    start_pos: 0,
                    end_pos: 0,
                })
            } else {
                parser.consume_expect(TokenKind::Keyword(Keyword::End))?;

                Ok(Expression {
                    kind: ExpressionKind::Conditional(Conditional {
                        condition,
                        then_arm,
                        else_arm: None,
                    }),
                    start_pos: 0,
                    end_pos: 0,
                })
            }
        } else {
            Ok(Expression {
                kind: ExpressionKind::Conditional(Conditional {
                    condition,
                    then_arm,
                    else_arm: None,
                }),
                start_pos: 0,
                end_pos: 0,
            })
        }
    }
}