Skip to main content

camel_dsl/
yaml_ast.rs

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    /// The log message. Can be a plain string literal or a nested expression object.
173    pub message: LogMessageData,
174    #[serde(default)]
175    pub level: Option<String>,
176}
177
178/// The `message` field inside a `log: { message: ... }` config block.
179/// Either a bare string literal or a value-source expression (simple, rhai, language+source).
180#[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}