use crate::{
events::Event,
ref_funcs::{ExternRefFunction, RefFunction},
};
use serde::{Deserialize, Serialize};
use std::{cell::RefCell, rc::Rc};
pub fn import_function(resource: &str, export: &str) -> Option<ExternRefFunction> {
#[derive(Serialize, Deserialize)]
struct Export(ExternRefFunction);
let link = Rc::new(RefCell::new(None));
let link_clone = link.clone();
let export = export_name(resource, export);
let func = RefFunction::new(move |input: Vec<Export>| -> Vec<bool> {
*link_clone.borrow_mut() = input.get(0).map(|exp| exp.0.clone());
vec![true]
});
let export_data = func.as_extern_ref_func();
crate::events::emit(&export, vec![Export(export_data)]);
let result = link.borrow();
result.as_ref().cloned()
}
pub fn make_export(export: &str, func: RefFunction) {
#[derive(Serialize, Deserialize)]
struct GetExport {
func: ExternRefFunction,
}
let resource = crate::invoker::current_resource_name().unwrap();
let export = export_name(&resource, export);
crate::events::set_event_handler_closure(
&export,
move |event: Event<GetExport>| {
let ext_func = &event.payload().func;
ext_func.invoke::<(), _>(vec![func.as_extern_ref_func()]);
},
crate::events::EventScope::Local,
);
}
fn export_name(resource: &str, export: &str) -> String {
format!("__cfx_export_{}_{}", resource, export)
}