pub use xplm_macros::plugin;
pub use xplm_macros::DataRefContainer;
pub mod aircraft;
pub mod camera;
pub mod command;
pub mod dataref;
pub mod graphics;
pub mod instance;
pub mod menu;
pub mod plugin;
pub mod scenery;
pub mod utilities;
#[cfg(feature = "widgets")]
pub mod widget;
#[cfg(feature = "XPLM210")]
pub mod processing;
pub mod window;
#[cfg(not(test))]
use std::ffi::CString;
pub fn guard<F: FnOnce() -> R + std::panic::UnwindSafe, R>(f: F) -> Option<R> {
match std::panic::catch_unwind(f) {
Ok(r) => Some(r),
Err(payload) => {
let msg = payload
.downcast_ref::<&str>()
.map(|s| s.to_string())
.or_else(|| payload.downcast_ref::<String>().cloned())
.unwrap_or_else(|| "panic across xplm FFI boundary".to_string());
log(&format!("xplm: caught panic at FFI boundary: {msg}\n"));
None
}
}
}
pub fn log(msg: &str) {
#[cfg(test)]
{
eprint!("{msg}");
}
#[cfg(not(test))]
{
let c_msg = CString::new(msg).unwrap_or_else(|e| {
let nul_position = e.nul_position();
CString::new(&e.into_vec()[..nul_position]).unwrap_or_default()
});
unsafe {
xplm_sys::XPLMDebugString(c_msg.as_ptr());
}
}
}