refactor: runtime_api 返回值类型与 trait 面拆出独立模块

This commit is contained in:
2026-09-15 17:34:54 +00:00
parent b0ed3641f3
commit c2f0df9cf1
3 changed files with 224 additions and 208 deletions
@@ -0,0 +1,44 @@
//! builtin native 函数的返回值:`Ok`/`Err`/`TailCall` 三态,含构造与转换辅助。
use oxide_types::value::JsValue;
/// 每个 builtin native 函数的返回值。
pub enum NativeResult {
Ok(JsValue),
Err(JsValue),
TailCall { callee: JsValue, this: JsValue, args: Vec<JsValue> },
}
impl NativeResult {
/// 构造成功结果,携带一个 `JsValue` 返回值。
pub fn ok(val: JsValue) -> Self {
Self::Ok(val)
}
/// 构造失败结果,携带被抛出的异常值。
pub fn err(val: JsValue) -> Self {
Self::Err(val)
}
/// 取出成功值;若为 `Err` 或 `TailCall` 则 panic。仅用于已知必然成功的场景。
pub fn unwrap(self) -> JsValue {
match self {
Self::Ok(val) => val,
Self::Err(_) => panic!("called `NativeResult::unwrap()` on an `Err` value"),
Self::TailCall { .. } => panic!("called `NativeResult::unwrap()` on a `TailCall` value"),
}
}
/// 把 `Err` 分支的错误值映射为自定义错误类型并转为 `Result`;
/// `TailCall` 不能转换,遇到时 panic。
pub fn map_err<E, F>(self, op: F) -> Result<JsValue, E>
where
F: FnOnce(JsValue) -> E,
{
match self {
Self::Ok(val) => Ok(val),
Self::Err(err) => Err(op(err)),
Self::TailCall { .. } => panic!("TailCall cannot be converted to Result"),
}
}
}