mumu-string 0.1.0

String functions and tools plugin for the Lava language
Documentation
use mumu::parser::types::Value;
use crate::common::{is_placeholder, make_one_arg_partial};

pub fn string_lower_bridge(_interp: &mut mumu::parser::interpreter::Interpreter, args: Vec<Value>) -> Result<Value, String> {
    match args.len() {
        0 => Ok(make_one_arg_partial(string_lower_finalize, None)),
        1 => {
            let first = &args[0];
            if is_placeholder(first) {
                Ok(make_one_arg_partial(string_lower_finalize, None))
            } else {
                string_lower_finalize(vec![first.clone()])
            }
        }
        n => Err(format!("string:lower => expected up to 1 argument, got {}", n)),
    }
}

fn string_lower_finalize(mut args: Vec<Value>) -> Result<Value, String> {
    if args.len() != 1 {
        return Err(format!("string:lower => finalize => expected 1 real arg, got {}", args.len()));
    }
    let data = args.remove(0);
    match data {
        Value::SingleString(s) => Ok(Value::SingleString(s.to_lowercase())),
        Value::StrArray(ref ss) if ss.len() == 1 => Ok(Value::SingleString(ss[0].to_lowercase())),
        other => Err(format!("string:lower => must be called with exactly one string, got {:?}", other)),
    }
}