maid-lang 1.1.0

Maid Programming Language
Documentation
use crate::{errors::standard_error::StandardError, nodes::ast_node::AstNode};

#[derive(Clone)]
pub struct ParseResult {
    pub error: Option<StandardError>,
    pub node: Option<Box<AstNode>>,
    pub last_registered_advance_count: usize,
    pub advance_count: usize,
    pub to_reverse_count: usize,
}

impl ParseResult {
    pub fn new() -> Self {
        Self {
            error: None,
            node: None,
            last_registered_advance_count: 0,
            advance_count: 0,
            to_reverse_count: 0,
        }
    }

    pub fn register_advancement(&mut self) {
        self.last_registered_advance_count = 1;
        self.advance_count += 1;
    }

    pub fn register(&mut self, parse_result: ParseResult) -> Option<Box<AstNode>> {
        self.last_registered_advance_count = parse_result.advance_count;
        self.advance_count += parse_result.advance_count;

        if parse_result.error.is_some() {
            self.error = parse_result.error
        }

        parse_result.node
    }

    pub fn try_register(&mut self, parse_result: ParseResult) -> Option<Box<AstNode>> {
        if parse_result.error.is_some() {
            self.to_reverse_count = parse_result.advance_count;

            return None;
        }

        self.register(parse_result)
    }

    pub fn success(&mut self, node: Option<Box<AstNode>>) -> ParseResult {
        self.node = node;

        self.clone()
    }

    pub fn failure(&mut self, error: Option<StandardError>) -> ParseResult {
        if self.error.is_none() || self.last_registered_advance_count == 0 {
            self.error = error
        }

        self.clone()
    }
}