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