moduforge_runtime/
macros.rs1#[macro_export]
2macro_rules! node {
3 ($name:expr) => {
4 {
5 let mut node = $crate::node::Node::default();
6 node.set_name($name);
7 node
8 }
9 };
10 ($name:expr, $desc:expr) => {
11 {
12 let mut node = $crate::node::Node::default();
13 node.set_name($name).set_desc($desc);
14 node
15 }
16 };
17 ($name:expr, $desc:expr, $content:expr) => {
18 {
19 let mut node = $crate::node::Node::default();
20 node.set_name($name).set_desc($desc).set_content($content);
21 node
22 }
23 };
24 ($name:expr, $desc:expr, $content:expr, $($key:expr => $value:expr),*) => {
25 {
26 let mut node = $crate::node::Node::default();
27 node.set_name($name)
28 .set_desc($desc)
29 .set_content($content);
30 $(
31 node.set_attr($key, Some($value));
32 )*
33 node
34 }
35 };
36}
37
38#[macro_export]
39macro_rules! mark {
40 ($name:expr) => {
41 {
42 let mut mark = $crate::mark::Mark::default();
43 mark.set_name($name);
44 mark
45 }
46 };
47 ($name:expr, $desc:expr) => {
48 {
49 let mut mark = $crate::mark::Mark::default();
50 mark.set_name($name).set_desc($desc);
51 mark
52 }
53 };
54 ($name:expr, $desc:expr, $($key:expr => $value:expr),*) => {
55 {
56 let mut mark = $crate::mark::Mark::default();
57 mark.set_name($name)
58 .set_desc($desc);
59 $(
60 mark.set_attr($key, Some($value));
61 )*
62 mark
63 }
64 };
65}
66
67#[macro_export]
68macro_rules! impl_plugin {
69 ($name:ident, $append_fn:expr) => {
70 #[derive(Debug)]
71 pub struct $name {}
72
73 #[async_trait]
74 impl PluginTrait for $name
75 where
76 Self: Send + Sync,
77 {
78 async fn append_transaction(
79 &self,
80 trs: &[Transaction],
81 old_state: &State,
82 new_state: &State,
83 ) -> Option<Transaction> {
84 $append_fn(trs, old_state, new_state).await
85 }
86
87 async fn filter_transaction(
88 &self,
89 _tr: &Transaction,
90 _state: &State,
91 ) -> bool {
92 true
93 }
94 }
95 };
96 ($name:ident, $append_fn:expr, $filter_fn:expr) => {
97 #[derive(Debug)]
98 pub struct $name {}
99
100 #[async_trait]
101 impl PluginTrait for $name
102 where
103 Self: Send + Sync,
104 {
105 async fn append_transaction(
106 &self,
107 tr: &Transaction,
108 old_state: &State,
109 new_state: &State,
110 ) -> Option<Transaction> {
111 $append_fn(tr, old_state, new_state).await
112 }
113
114 async fn filter_transaction(
115 &self,
116 tr: &Transaction,
117 state: &State,
118 ) -> bool {
119 $filter_fn(tr, state)
120 }
121 }
122 };
123}
124
125#[macro_export]
126macro_rules! impl_state_field {
127 ($name:ident, $init_fn:expr, $apply_fn:expr) => {
128 #[derive(Debug)]
129 pub struct $name;
130
131 #[async_trait]
132 impl StateField for $name
133 where
134 Self: Send + Sync,
135 {
136 async fn init(
137 &self,
138 config: &StateConfig,
139 instance: Option<&State>,
140 ) -> PluginState {
141 $init_fn(config, instance).await
142 }
143
144 async fn apply(
145 &self,
146 tr: &Transaction,
147 value: PluginState,
148 old_state: &State,
149 new_state: &State,
150 ) -> PluginState {
151 $apply_fn(tr, value, old_state, new_state).await
152 }
153 }
154 };
155}
156
157#[macro_export]
158macro_rules! impl_command {
159 ($name:ident, $execute_fn:expr) => {
160 #[derive(Debug)]
161 pub struct $name;
162
163 #[async_trait]
164 impl Command for $name {
165 async fn execute(
166 &self,
167 tr: &mut Transaction,
168 ) -> Result<(), TransformError> {
169 $execute_fn(tr).await
170 }
171
172 fn name(&self) -> String {
173 stringify!($name).to_string()
174 }
175 }
176 };
177 ($name:ident, $execute_fn:expr, $name_str:expr) => {
178 #[derive(Debug)]
179 pub struct $name;
180
181 #[async_trait]
182 impl Command for $name {
183 async fn execute(
184 &self,
185 tr: &mut Transaction,
186 ) -> Result<(), TransformError> {
187 $execute_fn(tr).await
188 }
189
190 fn name(&self) -> String {
191 $name_str.to_string()
192 }
193 }
194 };
195}