flecs_ecs 0.2.2

Rust API for the C/CPP flecs ECS library <https://github.com/SanderMertens/flecs>
Documentation
#![doc(hidden)]
use core::ffi::c_void;

#[cfg(target_family = "wasm")]
type EcsCtxFreeT = unsafe extern "C" fn(*mut c_void);
#[cfg(not(target_family = "wasm"))]
type EcsCtxFreeT = unsafe extern "C-unwind" fn(*mut c_void);

pub(crate) struct ComponentBindingCtx {
    pub(crate) on_add: Option<*mut c_void>,
    pub(crate) on_remove: Option<*mut c_void>,
    pub(crate) on_set: Option<*mut c_void>,
    pub(crate) on_replace: Option<*mut c_void>,
    pub(crate) free_on_add: Option<EcsCtxFreeT>,
    pub(crate) free_on_remove: Option<EcsCtxFreeT>,
    pub(crate) free_on_set: Option<EcsCtxFreeT>,
    pub(crate) free_on_replace: Option<EcsCtxFreeT>,
}

impl Drop for ComponentBindingCtx {
    fn drop(&mut self) {
        if std::thread::panicking() {
            return;
        }

        if let Some(on_add) = self.on_add
            && let Some(free_on_add) = self.free_on_add
        {
            unsafe { free_on_add(on_add) };
        }
        if let Some(on_remove) = self.on_remove
            && let Some(free_on_remove) = self.free_on_remove
        {
            unsafe { free_on_remove(on_remove) };
        }
        if let Some(on_set) = self.on_set
            && let Some(free_on_set) = self.free_on_set
        {
            unsafe { free_on_set(on_set) };
        }
        if let Some(on_replace) = self.on_replace
            && let Some(free_on_replace) = self.free_on_replace
        {
            unsafe { free_on_replace(on_replace) };
        }
    }
}

#[allow(clippy::derivable_impls)]
impl Default for ComponentBindingCtx {
    fn default() -> Self {
        Self {
            on_add: None,
            on_remove: None,
            on_set: None,
            on_replace: None,
            free_on_add: None,
            free_on_remove: None,
            free_on_set: None,
            free_on_replace: None,
        }
    }
}