rust_multistackvm 0.38.0

Stack-based virtual machine on top of rust_multistack crate
Documentation
use crate::multistackvm::VM;
use easy_error::{Error, bail};


pub fn stdlib_alias_inline(vm: &mut VM) -> Result<&mut VM, Error> {
    if vm.stack.current_stack_len() < 2 {
        bail!("Stack is too shallow for inline alias()");
    }
    match vm.stack.pull() {
        Some(alias_val) => {
            match vm.stack.pull() {
                Some(name_val) => {
                    match alias_val.cast_string() {
                        Ok(alias) => {
                            match name_val.cast_string() {
                                Ok(name) => {
                                    match vm.register_alias(alias, name) {
                                        Ok(_) => { return Ok(vm); }
                                        Err(err) => {
                                            bail!("ALIAS returns error: {}", err);
                                        }
                                    }
                                }
                                Err(err) => {
                                    bail!("ALIAS on name returns: {}", err);
                                }
                            }
                        }
                        Err(err) => {
                            bail!("ALIAS on alias returns: {}", err);
                        }
                    }
                }
                None => {
                    bail!("ALIAS returns: NO DATA on name");
                }
            }
        }
        None => {
            bail!("ALIAS returns: NO DATA on alias");
        }
    }
}

pub fn stdlib_unalias_inline(vm: &mut VM) -> Result<&mut VM, Error> {
    if vm.stack.current_stack_len() < 1 {
        bail!("Stack is too shallow for inline unalias()");
    }
    match vm.stack.pull() {
        Some(alias_val) => {
            match alias_val.cast_string() {
                Ok(alias) => {
                    match vm.unregister_alias(alias) {
                        Ok(_) => { return Ok(vm); }
                        Err(err) => {
                            bail!("UNALIAS returns error: {}", err);
                        }
                    }
                }
                Err(err) => {
                    bail!("UNALIAS on name returns: {}", err);
                }
            }
        }
        None => {
            bail!("UNALIAS returns: NO DATA on name");
        }
    }
}

pub fn init_stdlib(vm: &mut VM) {
    let _ = vm.register_inline("alias".to_string(), stdlib_alias_inline);
    let _ = vm.register_inline("unalias".to_string(), stdlib_unalias_inline);
}