1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use crate::sys::panda_cb_type;

mod closure;
mod export;
pub use closure::{set_plugin_ref, Callback};
pub use export::CallbackReturn;

mod ppp_closures;
pub use ppp_closures::{
    InternalPppClosureCallback, PppCallback, __internal_install_ppp_closure_callback,
};

/// An opaque type used to register/unregister callbacks with PANDA. Passed into init/unit
/// callbacks
pub struct PluginHandle;

/// A typeless PANDA callback used internally by callback attributes. Not recommended for direct
/// use.
#[doc(hidden)]
pub struct InternalCallback {
    pub cb_type: panda_cb_type,
    pub fn_pointer: *const (),
}

impl InternalCallback {
    pub fn new(cb_type: panda_cb_type, fn_pointer: *const ()) -> Self {
        Self {
            cb_type,
            fn_pointer,
        }
    }
}

/// A callback set to run on plugin uninit. To add an uninit callback use `#[panda::uninit]` on a
/// function which takes an `&mut PluginHandle` as an argument.
///
/// ### Example
///
/// ```rust
/// use panda::PluginHandle;
///
/// #[panda::uninit]
/// fn on_exit(plugin: &mut PluginHandle) {
///     // Do stuff
/// }
/// ```
pub struct UninitCallback(pub fn(&mut PluginHandle));

#[doc(hidden)]
pub struct PPPCallbackSetup(pub fn());

inventory::collect!(InternalCallback);
inventory::collect!(UninitCallback);
inventory::collect!(PPPCallbackSetup);