rscel 1.0.8

Cel interpreter in rust
Documentation
mod program_details;

use crate::{
    compiler::{ast_node::AstNode, grammar::Expr},
    types::CelByteCode,
    CelCompiler, CelResult, StringTokenizer,
};
pub use program_details::ProgramDetails;
use serde::{Deserialize, Serialize};

#[derive(Debug, Deserialize, Serialize)]
pub struct Program {
    details: ProgramDetails,
    bytecode: CelByteCode,
}

impl Program {
    pub fn new(details: ProgramDetails, bytecode: CelByteCode) -> Program {
        Program { details, bytecode }
    }

    pub fn from_source(source: &str) -> CelResult<Program> {
        CelCompiler::with_tokenizer(&mut StringTokenizer::with_input(source)).compile()
    }

    pub fn params<'a>(&'a self) -> Vec<&'a str> {
        self.details.params()
    }

    pub fn source<'a>(&'a self) -> Option<&'a str> {
        self.details.source()
    }

    pub fn into_details(self) -> ProgramDetails {
        self.details
    }

    pub fn details<'a>(&'a self) -> &'a ProgramDetails {
        &self.details
    }

    pub fn details_mut<'a>(&'a mut self) -> &'a mut ProgramDetails {
        &mut self.details
    }

    pub fn bytecode<'a>(&'a self) -> &'a CelByteCode {
        &self.bytecode
    }

    pub fn dumps_bc(&self) -> String {
        let mut lines = Vec::new();

        for code in self.bytecode.iter() {
            lines.push(format!("{:?}", code))
        }

        lines.join("\n")
    }

    pub fn ast<'a>(&'a self) -> Option<&'a AstNode<Expr>> {
        self.details.ast()
    }
}

impl Clone for Program {
    fn clone(&self) -> Self {
        Program {
            details: self.details.clone(),
            bytecode: self.bytecode.clone(),
        }
    }
}