Skip to main content

bpm_engine_runtime/
process_completed_handler.rs

1//! ProcessCompletedHandler: ProcessCompleted -> mark instance completed, persist.
2
3use async_trait::async_trait;
4use bpm_engine_core::{EngineEvent, InstanceState};
5use tracing::info;
6
7use super::handler::{EngineContext, EventHandler};
8
9pub struct ProcessCompletedHandler;
10
11#[async_trait]
12impl EventHandler for ProcessCompletedHandler {
13    async fn handle(&self, event: &EngineEvent, ctx: &mut EngineContext) -> Vec<EngineEvent> {
14        let EngineEvent::ProcessCompleted(p) = event else {
15            return vec![];
16        };
17        let instance_id = &p.instance_id;
18        if let Some(process_store) = ctx.process_store.as_ref() {
19            if let Ok(Some(mut instance)) = process_store.load(instance_id).await {
20                instance.state = InstanceState::Completed;
21                let _ = process_store.save(&instance).await;
22            }
23        }
24        info!(instance_id = %instance_id, "process completed");
25        vec![]
26    }
27}