1#![allow(clippy::missing_safety_doc)]
2
3use core::mem;
4
5use crate::{
6 bindings::*,
7 std_types::{c_float, c_int, c_void},
8};
9
10macro_rules! make_register {
11 ($func_name:ident, $name:ident) => {
12 paste::item! {
13 pub unsafe fn [<Event_Register $func_name>] (
14 handlers: *mut [<Event_ $name>],
15 obj: *mut c_void,
16 handler: [<Event_ $name _Callback>],
17 ) {
18 Event_Register(
19 handlers as *mut Event_Void,
20 obj,
21 #[allow(clippy::useless_transmute)]
22 mem::transmute::<[<Event_ $name _Callback>], Event_Void_Callback>(handler),
23 )
24 }
25
26 pub unsafe fn [<Event_Unregister $func_name>] (
27 handlers: *mut [<Event_ $name>],
28 obj: *mut c_void,
29 handler: [<Event_ $name _Callback>],
30 ) {
31 Event_Unregister(
32 handlers as *mut Event_Void,
33 obj,
34 #[allow(clippy::useless_transmute)]
35 mem::transmute::<[<Event_ $name _Callback>], Event_Void_Callback>(handler),
36 )
37 }
38 }
39 };
40
41 ($name:ident) => {
42 make_register!($name, $name);
43 };
44}
45
46macro_rules! make_raise {
47 (
48 $func_name:ident,
49 $name:ident,
50 ( $($arg:ident: $arg_type:ty),* )
51 ) => {
52 paste::item! {
53 pub unsafe fn [<Event_Raise $func_name>] (
54 handlers: &mut [<Event_ $name>],
55 $($arg: $arg_type,)*
56 ) {
57 for i in 0..handlers.Count {
58 if let Some(f) = handlers.Handlers[i as usize] {
59 (f)(
60 handlers.Objs[i as usize],
61 $($arg),*
62 );
63 }
64 }
65 }
66 }
67 };
68
69 (
70 $name:ident,
71 ( $($arg:ident: $arg_type:ty),* )
72 ) => {
73 make_raise!($name, $name, ( $($arg: $arg_type),* ));
74 }
75}
76
77make_register!(Void);
80make_register!(Int);
81make_register!(Float);
82
83make_register!(Entry);
84make_raise!(Entry, (stream: *mut Stream, name: *const cc_string));
85
86make_register!(Block);
87make_raise!(Block, (coords: IVec3, oldBlock: BlockID, block: BlockID));
88
89make_register!(Chat);
90make_raise!(Chat, (msg: *const cc_string, msgType: c_int));
91
92make_register!(Input);
93make_raise!(Input, (key: c_int, repeating: cc_bool, device: *mut InputDevice));
94
95make_register!(String);
96make_raise!(String, (s: *const cc_string));
97
98make_register!(RawMove);
99make_raise!(RawMove, (x_delta: c_float, y_delta: c_float));
100
101make_register!(PluginMessage);
102make_raise!(PluginMessage, (channel: u8, data: *mut u8));