use std::os::raw::c_void;
pub struct Interop {
api: *const crate::YogApi,
}
impl Interop {
pub(crate) fn new(api: *const crate::YogApi) -> Self {
Interop { api }
}
pub fn export(&self, symbol: &str, ptr: *const c_void) {
let mod_id = crate::__current_mod_id().unwrap_or_else(|| "unknown".into());
unsafe {
let api = &*self.api;
let mid = yog_abi::YogStr::from_str(&mod_id);
let sym = yog_abi::YogStr::from_str(symbol);
(api.interop_export)(api.ctx, mid, sym, ptr);
}
}
pub fn import_raw(&self, mod_id: &str, symbol: &str) -> Option<*const c_void> {
unsafe {
let api = &*self.api;
let mid = yog_abi::YogStr::from_str(mod_id);
let sym = yog_abi::YogStr::from_str(symbol);
let ptr = (api.interop_import)(api.ctx, mid, sym);
if ptr.is_null() { None } else { Some(ptr) }
}
}
pub fn import(&self, qualified: &str) -> Option<*const c_void> {
let (mod_id, symbol) = qualified.split_once(':')?;
self.import_raw(mod_id, symbol)
}
}