1use serde::Deserialize;
2
3#[derive(Deserialize)]
4pub struct YamlRoutes {
5 pub routes: Vec<YamlRoute>,
6}
7
8#[derive(Deserialize)]
9pub struct YamlRoute {
10 pub id: String,
11 pub from: String,
12 #[serde(default)]
13 pub steps: Vec<YamlStep>,
14 #[serde(default = "default_true")]
15 pub auto_startup: bool,
16 #[serde(default = "default_startup_order")]
17 pub startup_order: i32,
18 #[serde(default)]
19 pub sequential: bool,
20 #[serde(default)]
21 pub concurrent: Option<usize>,
22 #[serde(default)]
23 pub error_handler: Option<YamlErrorHandler>,
24 #[serde(default)]
25 pub circuit_breaker: Option<YamlCircuitBreaker>,
26}
27
28#[derive(Deserialize)]
29pub struct YamlErrorHandler {
30 #[serde(default)]
31 pub dead_letter_channel: Option<String>,
32 #[serde(default)]
33 pub retry: Option<YamlRetryPolicy>,
34}
35
36#[derive(Deserialize)]
37pub struct YamlRetryPolicy {
38 pub max_attempts: u32,
39 #[serde(default = "default_initial_delay_ms")]
40 pub initial_delay_ms: u64,
41 #[serde(default = "default_multiplier")]
42 pub multiplier: f64,
43 #[serde(default = "default_max_delay_ms")]
44 pub max_delay_ms: u64,
45 #[serde(default)]
46 pub handled_by: Option<String>,
47}
48
49#[derive(Deserialize)]
50pub struct YamlCircuitBreaker {
51 #[serde(default = "default_failure_threshold")]
52 pub failure_threshold: u32,
53 #[serde(default = "default_open_duration_ms")]
54 pub open_duration_ms: u64,
55}
56
57fn default_true() -> bool {
58 true
59}
60
61fn default_startup_order() -> i32 {
62 1000
63}
64
65fn default_initial_delay_ms() -> u64 {
66 100
67}
68
69fn default_multiplier() -> f64 {
70 2.0
71}
72
73fn default_max_delay_ms() -> u64 {
74 10_000
75}
76
77fn default_failure_threshold() -> u32 {
78 5
79}
80
81fn default_open_duration_ms() -> u64 {
82 30_000
83}
84
85#[derive(Deserialize, Debug)]
86#[serde(untagged)]
87pub enum YamlStep {
88 To(ToStep),
89 SetHeader(SetHeaderStep),
90 SetBody(SetBodyStep),
91 Log(LogStep),
92 Filter(FilterStep),
93 Choice(ChoiceStep),
94 Split(SplitStep),
95 Aggregate(AggregateStep),
96 WireTap(WireTapStep),
97 Multicast(MulticastStep),
98 Stop(StopStep),
99 Script(ScriptStep),
100 ConvertBodyTo(ConvertBodyToStep),
101}
102
103#[derive(Deserialize, Debug)]
104pub struct ToStep {
105 pub to: String,
106}
107
108#[derive(Deserialize, Debug)]
109pub struct SetHeaderStep {
110 pub set_header: SetHeaderData,
111}
112
113#[derive(Deserialize, Debug)]
114#[serde(deny_unknown_fields)]
115pub struct SetHeaderData {
116 pub key: String,
117 #[serde(default)]
118 pub value: Option<serde_json::Value>,
119 #[serde(default)]
120 pub language: Option<String>,
121 #[serde(default)]
122 pub source: Option<String>,
123 #[serde(default)]
124 pub simple: Option<String>,
125 #[serde(default)]
126 pub rhai: Option<String>,
127}
128
129#[derive(Deserialize, Debug)]
130pub struct SetBodyStep {
131 pub set_body: SetBodyData,
132}
133
134#[derive(Deserialize, Debug)]
135#[serde(untagged)]
136pub enum SetBodyData {
137 Literal(serde_json::Value),
138 Config(SetBodyConfig),
139}
140
141#[derive(Deserialize, Debug)]
142#[serde(deny_unknown_fields)]
143pub struct SetBodyConfig {
144 #[serde(default)]
145 pub value: Option<serde_json::Value>,
146 #[serde(default)]
147 pub language: Option<String>,
148 #[serde(default)]
149 pub source: Option<String>,
150 #[serde(default)]
151 pub simple: Option<String>,
152 #[serde(default)]
153 pub rhai: Option<String>,
154}
155
156#[derive(Deserialize, Debug)]
157#[serde(untagged)]
158pub enum LogBody {
159 Message(String),
160 Config(LogConfig),
161}
162
163#[derive(Deserialize, Debug)]
164#[serde(deny_unknown_fields)]
165pub struct LogConfig {
166 pub message: LogMessageData,
168 #[serde(default)]
169 pub level: Option<String>,
170}
171
172#[derive(Deserialize, Debug)]
175#[serde(untagged)]
176pub enum LogMessageData {
177 Literal(String),
178 Expr(LogMessageExpr),
179}
180
181#[derive(Deserialize, Debug)]
182#[serde(deny_unknown_fields)]
183pub struct LogMessageExpr {
184 #[serde(default)]
185 pub value: Option<String>,
186 #[serde(default)]
187 pub language: Option<String>,
188 #[serde(default)]
189 pub source: Option<String>,
190 #[serde(default)]
191 pub simple: Option<String>,
192 #[serde(default)]
193 pub rhai: Option<String>,
194}
195
196#[derive(Deserialize, Debug)]
197pub struct LogStep {
198 pub log: LogBody,
199}
200
201#[derive(Deserialize, Debug)]
202pub struct FilterStep {
203 pub filter: PredicateBlock,
204}
205
206#[derive(Deserialize, Debug)]
207#[serde(deny_unknown_fields)]
208pub struct PredicateBlock {
209 #[serde(default)]
210 pub language: Option<String>,
211 #[serde(default)]
212 pub source: Option<String>,
213 #[serde(default)]
214 pub simple: Option<String>,
215 #[serde(default)]
216 pub rhai: Option<String>,
217 #[serde(default)]
218 pub steps: Vec<YamlStep>,
219}
220
221#[derive(Deserialize, Debug)]
222pub struct ChoiceStep {
223 pub choice: ChoiceData,
224}
225
226#[derive(Deserialize, Debug)]
227#[serde(deny_unknown_fields)]
228pub struct ChoiceData {
229 #[serde(default)]
230 pub when: Vec<PredicateBlock>,
231 #[serde(default)]
232 pub otherwise: Option<Vec<YamlStep>>,
233}
234
235#[derive(Deserialize, Debug)]
236pub struct SplitStep {
237 pub split: SplitData,
238}
239
240#[derive(Deserialize, Debug)]
241#[serde(deny_unknown_fields)]
242pub struct SplitData {
243 #[serde(default)]
244 pub expression: Option<SplitExpressionYaml>,
245 #[serde(default = "default_split_aggregation")]
246 pub aggregation: String,
247 #[serde(default)]
248 pub parallel: bool,
249 #[serde(default)]
250 pub parallel_limit: Option<usize>,
251 #[serde(default = "default_true")]
252 pub stop_on_exception: bool,
253 #[serde(default)]
254 pub steps: Vec<YamlStep>,
255}
256
257#[derive(Deserialize, Debug, Clone)]
258#[serde(untagged)]
259pub enum SplitExpressionYaml {
260 Simple(String),
261 Config(SplitExpressionConfig),
262}
263
264#[derive(Deserialize, Debug, Clone)]
265#[serde(deny_unknown_fields)]
266pub struct SplitExpressionConfig {
267 #[serde(default)]
268 pub language: Option<String>,
269 #[serde(default)]
270 pub source: Option<String>,
271 #[serde(default)]
272 pub simple: Option<String>,
273 #[serde(default)]
274 pub rhai: Option<String>,
275}
276
277fn default_split_aggregation() -> String {
278 "last_wins".to_string()
279}
280
281#[derive(Deserialize, Debug)]
282pub struct AggregateStep {
283 pub aggregate: AggregateData,
284}
285
286#[derive(Deserialize, Debug)]
287#[serde(deny_unknown_fields)]
288pub struct AggregateData {
289 pub header: String,
290 #[serde(default)]
291 pub completion_size: Option<usize>,
292 #[serde(default)]
293 pub completion_timeout_ms: Option<u64>,
294 #[serde(default)]
295 pub completion_predicate: Option<PredicateBlock>,
296 #[serde(default = "default_aggregate_strategy")]
297 pub strategy: String,
298 #[serde(default)]
299 pub max_buckets: Option<usize>,
300 #[serde(default)]
301 pub bucket_ttl_ms: Option<u64>,
302}
303
304fn default_aggregate_strategy() -> String {
305 "collect_all".to_string()
306}
307
308#[derive(Deserialize, Debug)]
309pub struct WireTapStep {
310 pub wire_tap: String,
311}
312
313#[derive(Deserialize, Debug)]
314pub struct MulticastStep {
315 pub multicast: MulticastData,
316}
317
318#[derive(Deserialize, Debug)]
319#[serde(deny_unknown_fields)]
320pub struct MulticastData {
321 #[serde(default)]
322 pub parallel: bool,
323 #[serde(default)]
324 pub parallel_limit: Option<usize>,
325 #[serde(default)]
326 pub stop_on_exception: bool,
327 #[serde(default)]
328 pub timeout_ms: Option<u64>,
329 #[serde(default = "default_multicast_aggregation")]
330 pub aggregation: String,
331 #[serde(default)]
332 pub steps: Vec<YamlStep>,
333}
334
335fn default_multicast_aggregation() -> String {
336 "last_wins".to_string()
337}
338
339#[derive(Deserialize, Debug)]
340pub struct StopStep {
341 pub stop: bool,
342}
343
344#[derive(Deserialize, Debug)]
345pub struct ScriptStep {
346 pub script: ScriptData,
347}
348
349#[derive(Deserialize, Debug)]
350pub struct ConvertBodyToStep {
351 pub convert_body_to: String,
352}
353
354#[derive(Deserialize, Debug)]
355#[serde(deny_unknown_fields)]
356pub struct ScriptData {
357 pub language: String,
358 pub source: String,
359}