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 convert_case::{Case, Casing};
use easy_error::{Error, bail};

pub fn stdlib_string_case_upper(vm: &mut VM) -> Result<&mut VM, Error> {
    if vm.stack.current_stack_len() < 1 {
        bail!("Stack is too shallow for inline string_upper");
    }
    match vm.stack.pull() {
        Some(value) => {
            let data = match value.conv(STRING) {
                Ok(data) => data,
                Err(err) => {
                    bail!("STRING_UPPER return error: {}", err);
                }
            };
            match data.cast_string() {
                Ok(str_data) => {
                    vm.stack.push(Value::from_string(str_data.to_case(Case::Upper)));
                }
                Err(err) => {
                    bail!("STRING_UPPER return error: {}", err);
                }
            }
        }
        None => {
            bail!("STRING_UPPER returns: NO DATA #1");
        }
    }
    Ok(vm)
}

pub fn stdlib_string_case_lower(vm: &mut VM) -> Result<&mut VM, Error> {
    if vm.stack.current_stack_len() < 1 {
        bail!("Stack is too shallow for inline string_lower");
    }
    match vm.stack.pull() {
        Some(value) => {
            let data = match value.conv(STRING) {
                Ok(data) => data,
                Err(err) => {
                    bail!("STRING_LOWER return error: {}", err);
                }
            };
            match data.cast_string() {
                Ok(str_data) => {
                    vm.stack.push(Value::from_string(str_data.to_case(Case::Lower)));
                }
                Err(err) => {
                    bail!("STRING_LOWER return error: {}", err);
                }
            }
        }
        None => {
            bail!("STRING_LOWER returns: NO DATA #1");
        }
    }
    Ok(vm)
}

pub fn stdlib_string_case_snake(vm: &mut VM) -> Result<&mut VM, Error> {
    if vm.stack.current_stack_len() < 1 {
        bail!("Stack is too shallow for inline string_snake");
    }
    match vm.stack.pull() {
        Some(value) => {
            let data = match value.conv(STRING) {
                Ok(data) => data,
                Err(err) => {
                    bail!("STRING_LOWER return error: {}", err);
                }
            };
            match data.cast_string() {
                Ok(str_data) => {
                    vm.stack.push(Value::from_string(str_data.to_case(Case::Snake)));
                }
                Err(err) => {
                    bail!("STRING_SNAKE return error: {}", err);
                }
            }
        }
        None => {
            bail!("STRING_SNAKE returns: NO DATA #1");
        }
    }
    Ok(vm)
}

pub fn stdlib_string_case_title(vm: &mut VM) -> Result<&mut VM, Error> {
    if vm.stack.current_stack_len() < 1 {
        bail!("Stack is too shallow for inline string_title");
    }
    match vm.stack.pull() {
        Some(value) => {
            let data = match value.conv(STRING) {
                Ok(data) => data,
                Err(err) => {
                    bail!("STRING_TITLE return error: {}", err);
                }
            };
            match data.cast_string() {
                Ok(str_data) => {
                    vm.stack.push(Value::from_string(str_data.to_case(Case::Title)));
                }
                Err(err) => {
                    bail!("STRING_TITLE return error: {}", err);
                }
            }
        }
        None => {
            bail!("STRING_TITLE returns: NO DATA #1");
        }
    }
    Ok(vm)
}

pub fn stdlib_string_case_camel(vm: &mut VM) -> Result<&mut VM, Error> {
    if vm.stack.current_stack_len() < 1 {
        bail!("Stack is too shallow for inline string_camel");
    }
    match vm.stack.pull() {
        Some(value) => {
            let data = match value.conv(STRING) {
                Ok(data) => data,
                Err(err) => {
                    bail!("STRING_CAMEL return error: {}", err);
                }
            };
            match data.cast_string() {
                Ok(str_data) => {
                    vm.stack.push(Value::from_string(str_data.to_case(Case::Camel)));
                }
                Err(err) => {
                    bail!("STRING_CAMEL return error: {}", err);
                }
            }
        }
        None => {
            bail!("STRING_CAMEL returns: NO DATA #1");
        }
    }
    Ok(vm)
}

pub fn init_stdlib(vm: &mut VM) {
    let _ = vm.register_inline("string.upper".to_string(), stdlib_string_case_upper);
    let _ = vm.register_inline("string.lower".to_string(), stdlib_string_case_lower);
    let _ = vm.register_inline("string.snake".to_string(), stdlib_string_case_snake);
    let _ = vm.register_inline("string.title".to_string(), stdlib_string_case_title);
    let _ = vm.register_inline("string.camel".to_string(), stdlib_string_case_camel);
}