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