maid-lang 1.0.5

Maid Programming Language
Documentation
use crate::{errors::standard_error::StandardError, values::value::Value};

#[derive(Clone)]
pub struct RuntimeResult {
    pub value: Option<Value>,
    pub error: Option<StandardError>,
    pub func_return_value: Option<Value>,
    pub loop_should_continue: bool,
    pub loop_should_break: bool,
}

impl RuntimeResult {
    pub fn new() -> Self {
        Self {
            value: None,
            error: None,
            func_return_value: None,
            loop_should_continue: false,
            loop_should_break: false,
        }
    }

    pub fn reset(&mut self) {
        self.value = None;
        self.error = None;
        self.func_return_value = None;
        self.loop_should_continue = false;
        self.loop_should_break = false;
    }

    pub fn register(&mut self, result: RuntimeResult) -> Option<Value> {
        self.error = result.error;
        self.func_return_value = result.func_return_value;
        self.loop_should_continue = result.loop_should_continue;
        self.loop_should_break = result.loop_should_break;

        result.value
    }

    pub fn success(&mut self, value: Option<Value>) -> RuntimeResult {
        self.reset();
        self.value = value;

        self.clone()
    }

    pub fn success_return(&mut self, value: Option<Value>) -> RuntimeResult {
        self.reset();
        self.func_return_value = value;

        self.clone()
    }

    pub fn success_continue(&mut self) -> RuntimeResult {
        self.reset();
        self.loop_should_continue = true;

        self.clone()
    }

    pub fn success_break(&mut self) -> RuntimeResult {
        self.reset();
        self.loop_should_break = true;

        self.clone()
    }

    pub fn failure(&mut self, error: Option<StandardError>) -> RuntimeResult {
        self.reset();
        self.error = error;

        self.clone()
    }

    pub fn should_return(&self) -> bool {
        self.error.is_some()
            || self.func_return_value.is_some()
            || self.loop_should_continue
            || self.loop_should_break
    }
}