ffgl_core/
handler_macro.rs

1///Generate the ```extern "C" fn plugMain(op, input, instance)``` entry point
2#[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}