phlow_sdk/
macros.rs

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}