use std::sync::Mutex;
use std::sync::OnceLock;
use std::ffi::CStr;
use std::os::raw::c_char;
#[derive(Debug, Clone)]
pub enum PlatformEvent {
Event(String, String),
}
static PENDING_EVENTS: OnceLock<Mutex<Vec<PlatformEvent>>> = OnceLock::new();
pub fn push_event(event: PlatformEvent) {
let mutex = PENDING_EVENTS.get_or_init(|| Mutex::new(Vec::new()));
if let Ok(mut events) = mutex.lock() {
events.push(event);
}
}
pub fn poll_events() -> Vec<PlatformEvent> {
if let Some(mutex) = PENDING_EVENTS.get() {
if let Ok(mut events) = mutex.lock() {
return events.drain(..).collect();
}
}
Vec::new()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn spottedcat_push_platform_event(
event_type: *const c_char,
data: *const c_char,
) {
if event_type.is_null() || data.is_null() {
return;
}
let t = unsafe { CStr::from_ptr(event_type as *const _) }.to_string_lossy().into_owned();
let d = unsafe { CStr::from_ptr(data as *const _) }.to_string_lossy().into_owned();
push_event(PlatformEvent::Event(t, d));
}