rust_multistackvm 0.38.0

Stack-based virtual machine on top of rust_multistack crate
Documentation
use crate::multistackvm::*;
use rust_dynamic::value::Value;
use std::collections;
use easy_error::{bail, Error};

impl VM {
    pub fn ensure_var_namespace(&mut self, name: String) -> bool {
        if self.vars.contains_key(&name) {
            return true;
        }
        let _ = self.vars.insert(name, collections::HashMap::new());
        return false;
    }
    pub fn register_var(&mut self, name: String, value: Value) -> Result<&mut VM, Error> {
        let s_name = match self.stack.current_stack_name() {
            Some(s_name) => s_name,
            None => bail!("Can not detect current stack name"),
        };
        self.ensure_var_namespace(s_name.clone());
        match self.vars.get_mut(&s_name) {
            Some(n_table) => {
                let _ = n_table.insert(name, value);
            }
            None => bail!("VAR namespace {} is missed", &name),
        }
        Ok(self)
    }

    pub fn unregister_var(&mut self, name: String) -> Result<&mut VM, Error> {
        let s_name = match self.stack.current_stack_name() {
            Some(s_name) => s_name,
            None => bail!("Can not detect current stack name"),
        };
        self.ensure_var_namespace(s_name.clone());
        match self.vars.get_mut(&s_name) {
            Some(n_table) => {
                let _ = n_table.remove(&name);
            }
            None => bail!("VAR namespace {} is missed", &name),
        }
        Ok(self)
    }

    pub fn is_var(&mut self, name: String) -> bool {
        let s_name = match self.stack.current_stack_name() {
            Some(s_name) => s_name,
            None => return false,
        };
        self.ensure_var_namespace(s_name.clone());
        match self.vars.get_mut(&s_name) {
            Some(n_table) => {
                if n_table.contains_key(&name) {
                    return true;
                } else {
                    return false;
                }
            }
            None => return false,
        }
    }

    pub fn get_var(&mut self, name: String) -> Result<Value, Error> {
        let s_name = match self.stack.current_stack_name() {
            Some(s_name) => s_name,
            None => bail!("Can not detect current stack name"),
        };
        self.ensure_var_namespace(s_name.clone());
        match self.vars.get_mut(&s_name) {
            Some(n_table) => {
                match n_table.get(&name) {
                    Some(value) => return Ok(value.clone()),
                    None => bail!("VAR not regustered: {}", &name),
                };
            }
            None => bail!("VAR namespace {} is missed", &name),
        }
    }
}