1#[macro_export]
2macro_rules! listen {
3 ($rx:expr, $resolve:expr) => {{
4 for package in $rx {
5 $crate::tokio::spawn(async move {
6 $resolve(package).await;
7 });
8 }
9 }};
10 ($rx:expr, $resolve:expr, $( $arg:ident ),+ $(,)? ) => {{
11 for package in $rx {
12 $( let $arg = $arg.clone(); )+
13
14 $crate::tokio::spawn(async move {
15 $resolve(package, $( $arg ),+ ).await;
16 });
17 }
18 }};
19}
20
21#[macro_export]
22macro_rules! span_enter {
23 ($span:expr) => {
24 let span_enter_clone = $span.clone();
25 let _enter = span_enter_clone.enter();
26 };
27}
28
29#[macro_export]
30macro_rules! sender_safe {
31 ($sender:expr, $data:expr) => {
32 if let Err(err) = $sender.send($data) {
33 $crate::tracing::debug!("Error sending data: {:?}", err);
34 }
35 };
36}
37
38#[macro_export]
39macro_rules! sender_package {
40 ($id:expr, $sender:expr, $data:expr) => {{
41 let (tx, rx) = $crate::tokio::sync::oneshot::channel::<$crate::valu3::value::Value>();
42
43 let package = $crate::structs::Package {
44 response: Some(tx),
45 request_data: $data,
46 origin: $id,
47 span: None,
48 dispatch: None,
49 };
50
51 sender_safe!($sender, package);
52
53 rx
54 }};
55 ($span:expr, $dispatch:expr, $id:expr, $sender:expr, $data:expr) => {{
56 let (tx, rx) = $crate::tokio::sync::oneshot::channel::<$crate::valu3::value::Value>();
57
58 let package = $crate::structs::Package {
59 response: Some(tx),
60 request_data: $data,
61 origin: $id,
62 span: Some($span),
63 dispatch: Some($dispatch),
64 };
65
66 sender_safe!($sender, package);
67
68 rx
69 }};
70}
71
72#[macro_export]
73macro_rules! module_channel {
74 ($setup:expr) => {{
75 let (tx, rx) = $crate::crossbeam::channel::unbounded::<ModulePackage>();
76
77 sender_safe!($setup.setup_sender, Some(tx));
78
79 rx
80 }};
81}
82
83#[macro_export]
84macro_rules! create_step {
85 ($handler:ident(setup)) => {
86 #[no_mangle]
87 pub extern "C" fn plugin(setup: $crate::structs::ModuleSetup) {
88 if let Ok(rt) = $crate::tokio::runtime::Runtime::new() {
89 if let Err(e) = rt.block_on($handler(setup)) {
90 $crate::tracing::error!("Error in plugin: {:?}", e);
91 }
92 } else {
93 $crate::tracing::error!("Error creating runtime");
94 return;
95 };
96 }
97 };
98
99 ($handler:ident(rx)) => {
100 #[no_mangle]
101 pub extern "C" fn plugin(setup: $crate::structs::ModuleSetup) {
102 if let Ok(rt) = $crate::tokio::runtime::Runtime::new() {
103 let rx = module_channel!(setup);
104
105 if let Err(e) = rt.block_on($handler(rx)) {
106 $crate::tracing::error!("Error in plugin: {:?}", e);
107 }
108 } else {
109 $crate::tracing::error!("Error creating runtime");
110 return;
111 };
112 }
113 };
114}
115
116#[macro_export]
117macro_rules! create_main {
118 ($handler:ident(setup)) => {
119 #[no_mangle]
120 pub extern "C" fn plugin(setup: $crate::structs::ModuleSetup) {
121 let dispatch = setup.dispatch.clone();
122 $crate::tracing::dispatcher::with_default(&dispatch, || {
123 let _guard = $crate::otel::init_tracing_subscriber(setup.app_data.clone());
124
125 if let Ok(rt) = $crate::tokio::runtime::Runtime::new() {
126 rt.block_on($handler(setup)).unwrap_or_else(|e| {
127 $crate::tracing::error!("Error in plugin: {:?}", e);
128 });
129 } else {
130 $crate::tracing::error!("Error creating runtime");
131 return;
132 }
133 });
134 }
135 };
136}