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