rust_multistackvm 0.38.0

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

pub fn stdlib_string_concat_with_space(vm: &mut VM) -> Result<&mut VM, Error> {
    if vm.stack.current_stack_len() < 2 {
        bail!("Stack is too shallow for inline concat_with_space");
    }
    match vm.stack.pull() {
        Some(value) => {
            let data = match value.conv(STRING) {
                Ok(data) => data,
                Err(err) => {
                    bail!("CONCAT_WITH_SPACE return error: {}", err);
                }
            };
            match data.cast_string() {
                Ok(str_data) => {
                    match vm.stack.pull() {
                        Some(buffer) => {
                            if buffer.type_of() == TEXTBUFFER {
                                let nval = if buffer.len() == 0 {
                                    Value::from_string(format!("{}", str_data))
                                } else {
                                    Value::from_string(format!(" {}", str_data))
                                };
                                vm.stack.push(buffer + nval);
                            } else {
                                bail!("No textbuffer was found on stack");
                            }
                        }
                        None => {
                            bail!("CONCAT_WITH_SPACE returns: NO DATA #2");
                        }
                    }
                }
                Err(err) => {
                    bail!("CONCAT_WITH_SPACE return error: {}", err);
                }
            }
        }
        None => {
            bail!("CONCAT_WITH_SPACE returns: NO DATA #1");
        }
    }
    Ok(vm)
}


pub fn init_stdlib(vm: &mut VM) {
    let _ = vm.register_inline("concat_with_space".to_string(), stdlib_string_concat_with_space);
}