1use serde::{Deserialize, Serialize};
7use serde_json::Value;
8use std::collections::HashMap;
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct WorkflowDocument {
13 pub dsl: String,
15 pub namespace: String,
17 pub name: String,
19 pub version: String,
21 #[serde(skip_serializing_if = "Option::is_none")]
23 pub title: Option<String>,
24 #[serde(skip_serializing_if = "Option::is_none")]
26 pub summary: Option<String>,
27 #[serde(skip_serializing_if = "Option::is_none")]
29 pub description: Option<String>,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct ServerlessWorkflow {
35 pub document: WorkflowDocument,
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub input: Option<WorkflowInput>,
40 #[serde(rename = "do")]
42 pub r#do: Vec<WorkflowStep>,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub timeouts: Option<WorkflowTimeouts>,
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub events: Option<Vec<EventDefinition>>,
49 #[serde(skip_serializing_if = "Option::is_none")]
51 pub functions: Option<Vec<FunctionDefinition>>,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize)]
56pub struct WorkflowInput {
57 #[serde(skip_serializing_if = "Option::is_none")]
59 pub schema: Option<Value>,
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct WorkflowTimeouts {
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub workflow: Option<TimeoutDefinition>,
68 #[serde(skip_serializing_if = "Option::is_none")]
70 pub state: Option<TimeoutDefinition>,
71 #[serde(skip_serializing_if = "Option::is_none")]
73 pub action: Option<TimeoutDefinition>,
74}
75
76#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct TimeoutDefinition {
79 #[serde(skip_serializing_if = "Option::is_none")]
81 pub seconds: Option<u64>,
82 #[serde(skip_serializing_if = "Option::is_none")]
84 pub duration: Option<String>,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct EventDefinition {
90 pub name: String,
92 #[serde(skip_serializing_if = "Option::is_none")]
94 pub source: Option<String>,
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub r#type: Option<String>,
98 #[serde(skip_serializing_if = "Option::is_none")]
100 pub data: Option<Value>,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize)]
105pub struct FunctionDefinition {
106 pub name: String,
108 #[serde(rename = "type")]
110 pub function_type: String,
111 #[serde(skip_serializing_if = "Option::is_none")]
113 pub operation: Option<String>,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
118#[serde(untagged)]
119pub enum WorkflowStep {
120 Call {
122 #[serde(skip)]
124 name: String,
125 call: CallDefinition,
127 #[serde(skip_serializing_if = "Option::is_none")]
129 output: Option<String>,
130 },
131 Emit {
133 #[serde(skip)]
135 name: String,
136 emit: EmitDefinition,
138 },
139 Listen {
141 #[serde(skip)]
143 name: String,
144 listen: ListenDefinition,
146 #[serde(skip_serializing_if = "Option::is_none")]
148 output: Option<String>,
149 },
150 Wait {
152 #[serde(skip)]
154 name: String,
155 wait: WaitDefinition,
157 },
158 Run {
160 #[serde(skip)]
162 name: String,
163 run: RunDefinition,
165 #[serde(skip_serializing_if = "Option::is_none")]
167 output: Option<String>,
168 },
169 Switch {
171 #[serde(skip)]
173 name: String,
174 switch: Vec<SwitchCase>,
176 },
177 For {
179 #[serde(skip)]
181 name: String,
182 r#for: ForDefinition,
184 },
185 Fork {
187 #[serde(skip)]
189 name: String,
190 fork: ForkDefinition,
192 },
193 Try {
195 #[serde(skip)]
197 name: String,
198 r#try: TryDefinition,
200 },
201 Raise {
203 #[serde(skip)]
205 name: String,
206 raise: RaiseDefinition,
208 },
209 Set {
211 #[serde(skip)]
213 name: String,
214 set: HashMap<String, Value>,
216 },
217}
218
219#[derive(Debug, Clone, Serialize, Deserialize)]
221#[serde(untagged)]
222pub enum CallDefinition {
223 Http {
225 method: String,
227 endpoint: String,
229 #[serde(skip_serializing_if = "Option::is_none")]
231 headers: Option<HashMap<String, String>>,
232 #[serde(skip_serializing_if = "Option::is_none")]
234 body: Option<Value>,
235 #[serde(skip_serializing_if = "Option::is_none")]
237 auth: Option<Authentication>,
238 },
239 Grpc {
241 proto: ProtoDefinition,
243 service: ServiceDefinition,
245 method: String,
247 arguments: HashMap<String, Value>,
249 #[serde(skip_serializing_if = "Option::is_none")]
251 auth: Option<Authentication>,
252 },
253 OpenApi {
255 document: ApiDocument,
257 operation_id: String,
259 #[serde(skip_serializing_if = "Option::is_none")]
261 parameters: Option<HashMap<String, Value>>,
262 #[serde(skip_serializing_if = "Option::is_none")]
264 body: Option<Value>,
265 #[serde(skip_serializing_if = "Option::is_none")]
267 auth: Option<Authentication>,
268 },
269 AsyncApi {
271 document: ApiDocument,
273 operation_ref: String,
275 server: String,
277 message: MessageDefinition,
279 #[serde(skip_serializing_if = "Option::is_none")]
281 auth: Option<Authentication>,
282 },
283}
284
285#[derive(Debug, Clone, Serialize, Deserialize)]
287#[serde(untagged)]
288pub enum Authentication {
289 Basic {
291 username: String,
293 password: String,
295 },
296 Bearer {
298 token: String,
300 },
301 OAuth2 {
303 authority: String,
305 grant_type: String,
307 client_id: String,
309 client_secret: String,
311 #[serde(skip_serializing_if = "Option::is_none")]
313 scopes: Option<Vec<String>>,
314 },
315}
316
317#[derive(Debug, Clone, Serialize, Deserialize)]
319pub struct ProtoDefinition {
320 pub endpoint: String,
322}
323
324#[derive(Debug, Clone, Serialize, Deserialize)]
326pub struct ServiceDefinition {
327 pub name: String,
329 pub host: String,
331 pub port: u16,
333}
334
335#[derive(Debug, Clone, Serialize, Deserialize)]
337pub struct ApiDocument {
338 pub endpoint: String,
340}
341
342#[derive(Debug, Clone, Serialize, Deserialize)]
344pub struct MessageDefinition {
345 #[serde(skip_serializing_if = "Option::is_none")]
347 pub payload: Option<Value>,
348}
349
350#[derive(Debug, Clone, Serialize, Deserialize)]
352pub struct EmitDefinition {
353 pub event: EventInstance,
355}
356
357#[derive(Debug, Clone, Serialize, Deserialize)]
359pub struct EventInstance {
360 #[serde(skip_serializing_if = "Option::is_none")]
362 pub with: Option<EventData>,
363}
364
365#[derive(Debug, Clone, Serialize, Deserialize)]
367pub struct EventData {
368 #[serde(skip_serializing_if = "Option::is_none")]
370 pub source: Option<String>,
371 #[serde(skip_serializing_if = "Option::is_none")]
373 pub r#type: Option<String>,
374 #[serde(skip_serializing_if = "Option::is_none")]
376 pub data: Option<Value>,
377}
378
379#[derive(Debug, Clone, Serialize, Deserialize)]
381pub struct ListenDefinition {
382 pub to: ListenTarget,
384}
385
386#[derive(Debug, Clone, Serialize, Deserialize)]
388#[serde(untagged)]
389pub enum ListenTarget {
390 One {
392 with: EventFilter,
394 },
395 All {
397 with: Vec<EventFilter>,
399 },
400}
401
402#[derive(Debug, Clone, Serialize, Deserialize)]
404pub struct EventFilter {
405 #[serde(skip_serializing_if = "Option::is_none")]
407 pub r#type: Option<String>,
408 #[serde(skip_serializing_if = "Option::is_none")]
410 pub source: Option<String>,
411 #[serde(skip_serializing_if = "Option::is_none")]
413 pub data: Option<String>,
414}
415
416#[derive(Debug, Clone, Serialize, Deserialize)]
418#[serde(untagged)]
419pub enum WaitDefinition {
420 Duration {
422 seconds: u64,
424 },
425 Until {
427 timestamp: String,
429 },
430 Event {
432 event: EventFilter,
434 },
435}
436
437#[derive(Debug, Clone, Serialize, Deserialize)]
439#[serde(untagged)]
440pub enum RunDefinition {
441 Container {
443 container: ContainerDefinition,
445 },
446 Script {
448 script: ScriptDefinition,
450 },
451 Workflow {
453 workflow: SubWorkflowDefinition,
455 },
456}
457
458#[derive(Debug, Clone, Serialize, Deserialize)]
460pub struct ContainerDefinition {
461 pub image: String,
463 #[serde(skip_serializing_if = "Option::is_none")]
465 pub command: Option<Vec<String>>,
466 #[serde(skip_serializing_if = "Option::is_none")]
468 pub env: Option<HashMap<String, String>>,
469 #[serde(skip_serializing_if = "Option::is_none")]
471 pub volumes: Option<Vec<VolumeDefinition>>,
472}
473
474#[derive(Debug, Clone, Serialize, Deserialize)]
476pub struct ScriptDefinition {
477 #[serde(skip_serializing_if = "Option::is_none")]
479 pub language: Option<String>,
480 #[serde(skip_serializing_if = "Option::is_none")]
482 pub code: Option<String>,
483 #[serde(skip_serializing_if = "Option::is_none")]
485 pub arguments: Option<HashMap<String, Value>>,
486}
487
488#[derive(Debug, Clone, Serialize, Deserialize)]
490pub struct SubWorkflowDefinition {
491 #[serde(skip_serializing_if = "Option::is_none")]
493 pub namespace: Option<String>,
494 pub name: String,
496 #[serde(skip_serializing_if = "Option::is_none")]
498 pub version: Option<String>,
499 #[serde(skip_serializing_if = "Option::is_none")]
501 pub input: Option<Value>,
502}
503
504#[derive(Debug, Clone, Serialize, Deserialize)]
506pub struct VolumeDefinition {
507 pub host_path: String,
509 pub container_path: String,
511}
512
513#[derive(Debug, Clone, Serialize, Deserialize)]
515pub struct SwitchCase {
516 #[serde(skip_serializing_if = "Option::is_none")]
518 pub name: Option<String>,
519 #[serde(skip_serializing_if = "Option::is_none")]
521 pub when: Option<String>,
522 #[serde(skip_serializing_if = "Option::is_none")]
524 pub then: Option<String>,
525 #[serde(skip_serializing_if = "Option::is_none")]
527 pub default: Option<bool>,
528}
529
530#[derive(Debug, Clone, Serialize, Deserialize)]
532pub struct ForDefinition {
533 #[serde(skip_serializing_if = "Option::is_none")]
535 pub each: Option<String>,
536 #[serde(skip_serializing_if = "Option::is_none")]
538 pub in_expr: Option<String>,
539 #[serde(skip_serializing_if = "Option::is_none")]
541 pub at: Option<String>,
542 #[serde(skip_serializing_if = "Option::is_none")]
544 pub while_expr: Option<String>,
545 pub do_steps: Vec<WorkflowStep>,
547}
548
549#[derive(Debug, Clone, Serialize, Deserialize)]
551pub struct ForkDefinition {
552 pub branches: Vec<ForkBranch>,
554 #[serde(skip_serializing_if = "Option::is_none")]
556 pub compete: Option<bool>,
557}
558
559#[derive(Debug, Clone, Serialize, Deserialize)]
561pub struct ForkBranch {
562 #[serde(skip_serializing_if = "Option::is_none")]
564 pub name: Option<String>,
565 pub do_steps: Vec<WorkflowStep>,
567}
568
569#[derive(Debug, Clone, Serialize, Deserialize)]
571pub struct TryDefinition {
572 pub do_steps: Vec<WorkflowStep>,
574 #[serde(skip_serializing_if = "Option::is_none")]
576 pub catch: Option<Vec<CatchDefinition>>,
577}
578
579#[derive(Debug, Clone, Serialize, Deserialize)]
581pub struct CatchDefinition {
582 #[serde(skip_serializing_if = "Option::is_none")]
584 pub errors: Option<ErrorFilter>,
585 #[serde(skip_serializing_if = "Option::is_none")]
587 pub as_var: Option<String>,
588 pub do_steps: Vec<WorkflowStep>,
590}
591
592#[derive(Debug, Clone, Serialize, Deserialize)]
594pub struct ErrorFilter {
595 #[serde(skip_serializing_if = "Option::is_none")]
597 pub r#type: Option<String>,
598 #[serde(skip_serializing_if = "Option::is_none")]
600 pub status: Option<String>,
601}
602
603#[derive(Debug, Clone, Serialize, Deserialize)]
605pub struct RaiseDefinition {
606 pub error: ErrorDefinition,
608}
609
610#[derive(Debug, Clone, Serialize, Deserialize)]
612pub struct ErrorDefinition {
613 #[serde(skip_serializing_if = "Option::is_none")]
615 pub r#type: Option<String>,
616 #[serde(skip_serializing_if = "Option::is_none")]
618 pub status: Option<u16>,
619 #[serde(skip_serializing_if = "Option::is_none")]
621 pub title: Option<String>,
622 #[serde(skip_serializing_if = "Option::is_none")]
624 pub detail: Option<String>,
625 #[serde(skip_serializing_if = "Option::is_none")]
627 pub instance: Option<String>,
628}