Skip to main content

bpmn_engine/elements/
task.rs

1//! Task Elements
2//!
3//! Implementation of BPMN task elements with Activity/Capability traits.
4
5use crate::activity::{Activity, ActivityError, ActivityResult};
6use crate::capability::{Capability, CapabilityError, CapabilityResult, CapabilityProvider};
7use crate::engine::ExecutionContext;
8use crate::model::{ServiceTask, UserTask, ScriptTask, ManualTask};
9use async_trait::async_trait;
10use std::collections::HashMap;
11
12/// Service Task Activity
13///
14/// Implements Activity trait for ServiceTask elements.
15pub struct ServiceTaskActivity {
16    task: ServiceTask,
17}
18
19impl ServiceTaskActivity {
20    pub fn new(task: ServiceTask) -> Self {
21        Self { task }
22    }
23}
24
25#[async_trait]
26impl Activity for ServiceTaskActivity {
27    async fn execute(&self, context: &mut ExecutionContext) -> Result<ActivityResult, ActivityError> {
28        // TODO: Implement service task execution
29        // For now, just complete immediately
30        Ok(ActivityResult::Completed { output_variables: None })
31    }
32
33    fn id(&self) -> &str {
34        &self.task.base.id
35    }
36
37    fn name(&self) -> Option<&str> {
38        self.task.base.name.as_deref()
39    }
40}
41
42/// User Task Activity
43///
44/// Implements Activity trait for UserTask elements.
45pub struct UserTaskActivity {
46    task: UserTask,
47}
48
49impl UserTaskActivity {
50    pub fn new(task: UserTask) -> Self {
51        Self { task }
52    }
53}
54
55#[async_trait]
56impl Activity for UserTaskActivity {
57    async fn execute(&self, context: &mut ExecutionContext) -> Result<ActivityResult, ActivityError> {
58        // User tasks wait for user input
59        Ok(ActivityResult::Waiting {
60            reason: format!("User task '{}' waiting for user input", self.task.base.id),
61        })
62    }
63
64    fn id(&self) -> &str {
65        &self.task.base.id
66    }
67
68    fn name(&self) -> Option<&str> {
69        self.task.base.name.as_deref()
70    }
71}
72
73/// Script Task Activity
74///
75/// Implements Activity trait for ScriptTask elements.
76pub struct ScriptTaskActivity {
77    task: ScriptTask,
78}
79
80impl ScriptTaskActivity {
81    pub fn new(task: ScriptTask) -> Self {
82        Self { task }
83    }
84}
85
86#[async_trait]
87impl Activity for ScriptTaskActivity {
88    async fn execute(&self, context: &mut ExecutionContext) -> Result<ActivityResult, ActivityError> {
89        // TODO: Implement script execution
90        // For now, just complete immediately
91        Ok(ActivityResult::Completed { output_variables: None })
92    }
93
94    fn id(&self) -> &str {
95        &self.task.base.id
96    }
97
98    fn name(&self) -> Option<&str> {
99        self.task.base.name.as_deref()
100    }
101}
102
103/// Manual Task Activity
104///
105/// Implements Activity trait for ManualTask elements.
106pub struct ManualTaskActivity {
107    task: ManualTask,
108}
109
110impl ManualTaskActivity {
111    pub fn new(task: ManualTask) -> Self {
112        Self { task }
113    }
114}
115
116#[async_trait]
117impl Activity for ManualTaskActivity {
118    async fn execute(&self, context: &mut ExecutionContext) -> Result<ActivityResult, ActivityError> {
119        // Manual tasks are completed immediately (they represent manual work outside the system)
120        Ok(ActivityResult::Completed { output_variables: None })
121    }
122
123    fn id(&self) -> &str {
124        &self.task.base.id
125    }
126
127    fn name(&self) -> Option<&str> {
128        self.task.base.name.as_deref()
129    }
130}