1pub mod payloads {
3 use std::collections::HashMap;
4
5 #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
6 pub struct ProcessStarted {
7 pub process_id: String,
8 pub instance_id: String,
9 #[serde(default)]
10 pub initial_variables: Option<HashMap<String, String>>,
11 }
12
13 #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
14 pub struct TokenArrived {
15 pub instance_id: String,
16 pub token_id: String,
17 pub node_id: String,
18 }
19
20 #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
21 pub struct TokenCompleted {
22 pub instance_id: String,
23 pub token_id: String,
24 }
25
26 #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
27 pub struct UserTaskCreated {
28 pub instance_id: String,
29 pub node_id: String,
30 }
31
32 #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
33 pub struct UserTaskCompleted {
34 pub task_id: String,
35 pub instance_id: String,
36 pub node_id: String,
37 pub variables: HashMap<String, String>,
38 }
39
40 #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
41 pub struct TimerFired {
42 pub timer_id: String,
43 pub token_id: String,
44 }
45
46 #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
47 pub struct TimerScheduled {
48 pub timer_id: String,
49 pub instance_id: String,
50 pub token_id: String,
51 pub node_id: String,
52 pub fire_at: u64,
53 }
54
55 #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
56 pub struct TokenFailed {
57 pub instance_id: String,
58 pub token_id: String,
59 pub node_id: String,
60 pub reason: String,
61 }
62
63 #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
64 pub struct SagaStarted {
65 pub instance_id: String,
66 pub token_id: String,
67 pub node_id: String,
68 }
69
70 #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
71 pub struct SagaCompleted {
72 pub instance_id: String,
73 pub token_id: String,
74 pub node_id: String,
75 }
76
77 #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
78 pub struct ProcessCompleted {
79 pub instance_id: String,
80 }
81}
82
83#[derive(Debug, Clone)]
84pub enum EngineEvent {
85 ProcessStarted(payloads::ProcessStarted),
86 TokenArrived(payloads::TokenArrived),
87 TokenCompleted(payloads::TokenCompleted),
88 UserTaskCreated(payloads::UserTaskCreated),
89 UserTaskCompleted(payloads::UserTaskCompleted),
90 TimerFired(payloads::TimerFired),
91 TimerScheduled(payloads::TimerScheduled),
92 TokenFailed(payloads::TokenFailed),
93 SagaStarted(payloads::SagaStarted),
94 SagaCompleted(payloads::SagaCompleted),
95 ProcessCompleted(payloads::ProcessCompleted),
96}
97
98pub fn event_from_outbox(event_type: &str, payload: &str) -> Option<EngineEvent> {
99 let ev = match event_type {
100 "ProcessStarted" => EngineEvent::ProcessStarted(serde_json::from_str(payload).ok()?),
101 "TokenArrived" => EngineEvent::TokenArrived(serde_json::from_str(payload).ok()?),
102 "TokenCompleted" => EngineEvent::TokenCompleted(serde_json::from_str(payload).ok()?),
103 "UserTaskCreated" => EngineEvent::UserTaskCreated(serde_json::from_str(payload).ok()?),
104 "UserTaskCompleted" => EngineEvent::UserTaskCompleted(serde_json::from_str(payload).ok()?),
105 "TimerFired" => EngineEvent::TimerFired(serde_json::from_str(payload).ok()?),
106 "TimerScheduled" => EngineEvent::TimerScheduled(serde_json::from_str(payload).ok()?),
107 "TokenFailed" => EngineEvent::TokenFailed(serde_json::from_str(payload).ok()?),
108 "SagaStarted" => EngineEvent::SagaStarted(serde_json::from_str(payload).ok()?),
109 "SagaCompleted" => EngineEvent::SagaCompleted(serde_json::from_str(payload).ok()?),
110 "ProcessCompleted" => EngineEvent::ProcessCompleted(serde_json::from_str(payload).ok()?),
111 _ => return None,
112 };
113 Some(ev)
114}