ffgl_core/
handler_macro.rs1#[macro_export]
3macro_rules! plugin_main {
4 ($handler:ty) => {
5 #[no_mangle]
6 #[allow(non_snake_case)]
7 #[allow(unused_variables)]
8 extern "C" fn plugMain(
9 functionCode: u32,
10 inputValue: $crate::conversions::FFGLVal,
11 instanceID: *mut $crate::handler::Instance<
12 <$handler as $crate::handler::FFGLHandler>::Instance,
13 >,
14 ) -> $crate::conversions::FFGLVal {
15 use $crate::conversions::*;
16 match $crate::conversions::Op::try_from(functionCode) {
17 Ok(function) => {
18 $crate::tracing::trace!("Op::{function:?}");
19 let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
20 $crate::entry::default_ffgl_entry::<$handler>(
21 function,
22 inputValue,
23 unsafe { instanceID.as_mut() },
24 )
25 }));
26
27 match result {
28 Ok(result) => match result {
29 Ok(result) => result,
30 Err(err) => {
31 $crate::tracing::error!(
32 target: "plugin_main",
33 "ERROR in {function:?}: {:?}",
34 err,
35 );
36 SuccessVal::Fail.into()
37 }
38 },
39 Err(err) => {
40 $crate::tracing::error!(target: "plugin_main", "PANIC AT FFGL C BOUNDARY: {:?}", err);
41 SuccessVal::Fail.into()
42 }
43 }
44 }
45 Err(err) => {
46 $crate::tracing::error!(target: "plugin_main", "ERR: UNKNOWN OPCODE {functionCode}");
47 SuccessVal::Fail.into()
48 }
49 }
50 }
51
52 #[no_mangle]
53 #[allow(non_snake_case)]
54 pub extern "C" fn SetLogCallback(logCallback: $crate::log::FFGLLogger) {
55 $crate::log::init_logger(logCallback);
56 }
57 };
58}