use mumu::parser::types::Value;
use crate::common::{is_placeholder, make_one_arg_partial};
pub fn string_length_bridge(_interp: &mut mumu::parser::interpreter::Interpreter, args: Vec<Value>) -> Result<Value, String> {
match args.len() {
0 => Ok(make_one_arg_partial(string_length_finalize, None)),
1 => {
let first = &args[0];
if is_placeholder(first) {
Ok(make_one_arg_partial(string_length_finalize, None))
} else {
string_length_finalize(vec![first.clone()])
}
}
n => Err(format!("string:length => expected up to 1 argument, got {}", n)),
}
}
fn string_length_finalize(mut args: Vec<Value>) -> Result<Value, String> {
if args.len() != 1 {
return Err(format!("string:length => finalize => expected 1 real arg, got {}", args.len()));
}
let data = args.remove(0);
match data {
Value::SingleString(s) => Ok(Value::Int(s.len() as i32)),
Value::StrArray(ref ss) if ss.len() == 1 => Ok(Value::Int(ss[0].len() as i32)),
other => Err(format!("string:length => must be called with exactly one string, got {:?}", other)),
}
}