use sim_kernel::{Args, Cx, Result, Value};
#[derive(Clone, Debug)]
pub enum ProtectedOutcome<E = Value> {
Returned(Vec<Value>),
Raised(E),
}
pub fn protected_call(
cx: &mut Cx,
function: Value,
args: Args,
map_error: impl FnOnce(&mut Cx, sim_kernel::Error) -> Result<Value>,
) -> Result<ProtectedOutcome> {
protected_call_with(cx, function, args, map_error)
}
pub fn protected_call_with<E>(
cx: &mut Cx,
function: Value,
args: Args,
map_error: impl FnOnce(&mut Cx, sim_kernel::Error) -> Result<E>,
) -> Result<ProtectedOutcome<E>> {
match cx.call_value(function, args) {
Ok(value) => Ok(ProtectedOutcome::Returned(vec![value])),
Err(error) => Ok(ProtectedOutcome::Raised(map_error(cx, error)?)),
}
}