rscel 1.0.8

Cel interpreter in rust
Documentation
use crate::{
    compiler::{ast_node::AstNode, grammar::Expr},
    utils::IdentFilterIter,
    BindContext,
};
use serde::{Deserialize, Serialize};
use serde_with::serde_as;
use std::collections::HashSet;

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde_as]
pub struct ProgramDetails {
    source: Option<String>,
    params: HashSet<String>,
    #[serde(skip_serializing, skip_deserializing)]
    ast: Option<AstNode<Expr>>,
}

impl ProgramDetails {
    pub fn new() -> ProgramDetails {
        ProgramDetails {
            source: None,
            params: HashSet::new(),
            ast: None,
        }
    }

    pub fn joined2(mut pd1: ProgramDetails, pd2: ProgramDetails) -> ProgramDetails {
        pd1.union_from(pd2);
        pd1
    }

    pub fn add_ast(&mut self, ast: AstNode<Expr>) {
        self.ast = Some(ast);
    }

    pub fn add_source(&mut self, source: String) {
        self.source = Some(source);
    }

    pub fn union_from(&mut self, other: ProgramDetails) {
        for param in other.params.iter() {
            self.params.insert(param.to_string());
        }
    }

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

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

    pub fn add_param(&mut self, name: &str) {
        self.params.insert(name.to_owned());
    }

    pub fn params<'a>(&'a self) -> Vec<&'a str> {
        self.params.iter().map(|x| x.as_str()).collect()
    }

    pub fn filter_from_bindings(&mut self, bindings: &BindContext) {
        self.params =
            IdentFilterIter::new(bindings, &mut self.params.iter().map(|x| x.as_str())).collect();
    }
}