use std::collections::HashMap;
use crate::nan_value::{Arena, NanValue};
use crate::value::{RuntimeError, Value};
pub fn register(global: &mut HashMap<String, Value>) {
let _ = global;
}
pub fn extra_members() -> Vec<(&'static str, String)> {
vec![("withDefault", "Result.withDefault".to_string())]
}
pub fn effects(_name: &str) -> &'static [&'static str] {
&[]
}
pub fn call(name: &str, args: &[Value]) -> Option<Result<Value, RuntimeError>> {
match name {
"Result.withDefault" => Some(with_default(args)),
_ => None,
}
}
fn with_default(args: &[Value]) -> Result<Value, RuntimeError> {
if args.len() != 2 {
return Err(RuntimeError::Error(format!(
"Result.withDefault() takes 2 arguments (result, default), got {}",
args.len()
)));
}
match &args[0] {
Value::Ok(v) => Ok(*v.clone()),
Value::Err(_) => Ok(args[1].clone()),
_ => Err(RuntimeError::Error(
"Result.withDefault: first argument must be a Result".to_string(),
)),
}
}
pub fn call_nv(
name: &str,
args: &[NanValue],
arena: &mut Arena,
) -> Option<Result<NanValue, RuntimeError>> {
match name {
"Result.withDefault" => Some(with_default_nv(args, arena)),
_ => None,
}
}
fn with_default_nv(args: &[NanValue], arena: &mut Arena) -> Result<NanValue, RuntimeError> {
if args.len() != 2 {
return Err(RuntimeError::Error(format!(
"Result.withDefault() takes 2 arguments (result, default), got {}",
args.len()
)));
}
let v = args[0];
if v.is_ok() {
Ok(v.wrapper_inner(arena))
} else if v.is_err() {
Ok(args[1])
} else {
Err(RuntimeError::Error(
"Result.withDefault: first argument must be a Result".to_string(),
))
}
}