use core::ffi::c_void;
use core::ptr::NonNull;
use crate::Task;
pub use bun_core::JsError as ErasedJsError;
pub type JsResult<T> = core::result::Result<T, ErasedJsError>;
pub struct AnyTask {
pub ctx: Option<NonNull<c_void>>,
pub callback: fn(*mut c_void) -> JsResult<()>,
}
impl Default for AnyTask {
fn default() -> Self {
Self {
ctx: None,
callback: |_| unreachable!("AnyTask.callback was undefined"),
}
}
}
impl AnyTask {
pub fn task(&mut self) -> Task {
Task::init(self)
}
pub fn run(&mut self) -> JsResult<()> {
let callback = self.callback;
let ctx = self.ctx;
callback(ctx.expect("ctx").as_ptr())
}
}
impl AnyTask {
#[inline]
pub fn from_typed<T>(ctx: *mut T, callback: fn(*mut T) -> JsResult<()>) -> Self {
Self {
ctx: NonNull::new(ctx.cast::<c_void>()),
callback: unsafe {
core::mem::transmute::<fn(*mut T) -> JsResult<()>, fn(*mut c_void) -> JsResult<()>>(
callback,
)
},
}
}
}