Skip to main content

bpm_engine_core/
event.rs

1// Placeholder; full content in step 2 (payloads + event_from_outbox need serde_json).
2pub 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}