use mumu::{
parser::interpreter::Interpreter,
parser::types::{FunctionValue, Value},
};
use std::sync::{Arc, Mutex};
pub fn array_keys_bridge(
_interp: &mut Interpreter,
args: Vec<Value>,
) -> Result<Value, String> {
if args.len() != 1 {
return Err(format!(
"array:keys => expected 1 argument (keyed_array), got {}",
args.len()
));
}
match &args[0] {
Value::KeyedArray(map) => {
let keys: Vec<String> = map.keys().cloned().collect();
Ok(Value::StrArray(keys))
}
other => Err(format!(
"array:keys => argument must be a keyed array, got {:?}",
other
)),
}
}
pub fn register_keys(interp: &mut Interpreter) {
let dyn_fn = Arc::new(Mutex::new(array_keys_bridge));
interp.register_dynamic_function("array:keys", dyn_fn);
interp.set_variable(
"array:keys",
Value::Function(Box::new(FunctionValue::Named("array:keys".to_string()))),
);
}