use std::collections::HashMap;
use std::ffi::c_char;
use std::sync::{Arc, Mutex, OnceLock};
#[repr(C)]
#[derive(Clone)]
pub struct HostCallbacks {
pub send_to_frontend: extern "C" fn(*const c_char, *const c_char) -> bool,
pub get_app_config: extern "C" fn(*const c_char) -> *const c_char,
pub call_other_plugin: extern "C" fn(*const c_char, *const c_char) -> *const c_char,
}
impl std::fmt::Debug for HostCallbacks {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("HostCallbacks")
.field("send_to_frontend", &"<function pointer>")
.field("get_app_config", &"<function pointer>")
.field("call_other_plugin", &"<function pointer>")
.finish()
}
}
static INSTANCE_CALLBACKS: OnceLock<Arc<Mutex<HashMap<String, HostCallbacks>>>> = OnceLock::new();
fn init_instance_callbacks() -> &'static Arc<Mutex<HashMap<String, HostCallbacks>>> {
INSTANCE_CALLBACKS.get_or_init(|| Arc::new(Mutex::new(HashMap::new())))
}
pub fn set_host_callbacks(instance_id: &str, callbacks: HostCallbacks) -> Result<(), String> {
let storage = init_instance_callbacks();
let mut map = storage
.lock()
.map_err(|_| "Failed to lock callbacks storage")?;
map.insert(instance_id.to_string(), callbacks);
Ok(())
}
pub fn get_host_callbacks(instance_id: &str) -> Option<HostCallbacks> {
let storage = init_instance_callbacks();
let map = storage.lock().ok()?;
map.get(instance_id).cloned()
}
pub fn clear_host_callbacks(instance_id: &str) -> bool {
let storage = init_instance_callbacks();
if let Ok(mut map) = storage.lock() {
map.remove(instance_id).is_some()
} else {
false
}
}