use std::ffi::{c_char, c_void};
use reflow_actor::Actor;
use std::sync::Arc;
pub type PackFactoryFn =
Option<unsafe extern "C" fn(user_data: *mut c_void) -> *mut PackActorHandle>;
pub type PackFactoryDropFn = Option<unsafe extern "C" fn(user_data: *mut c_void)>;
pub struct PackActorHandle {
pub(crate) inner: Arc<dyn Actor>,
}
impl PackActorHandle {
pub fn new(actor: Arc<dyn Actor>) -> *mut PackActorHandle {
Box::into_raw(Box::new(PackActorHandle { inner: actor }))
}
pub unsafe fn unbox(ptr: *mut PackActorHandle) -> Option<Arc<dyn Actor>> {
if ptr.is_null() {
return None;
}
Some(unsafe { Box::from_raw(ptr) }.inner)
}
}
#[repr(i32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PackRegisterStatus {
Ok = 0,
NullArg = -1,
BadUtf8 = -2,
Duplicate = -3,
Internal = -99,
}
#[repr(C)]
pub struct PackHostVtable {
pub host_data: *mut c_void,
pub register_template: unsafe extern "C" fn(
host_data: *mut c_void,
template_id: *const c_char,
factory: PackFactoryFn,
drop: PackFactoryDropFn,
factory_user_data: *mut c_void,
) -> i32,
}