bpmn_engine/capability/traits.rs
1//! Capability Traits
2//!
3//! Capability trait definitions for BPMN elements that define what they can do.
4//!
5//! Capabilities represent the abilities or features that BPMN elements provide.
6//! This allows for a flexible, extensible design where elements can be composed
7//! based on their capabilities.
8
9use crate::engine::ExecutionContext;
10use async_trait::async_trait;
11use std::collections::HashMap;
12
13/// Capability Trait
14///
15/// Represents a capability that a BPMN element can provide.
16/// Capabilities define what an element can do, allowing for flexible composition.
17#[async_trait]
18pub trait Capability: Send + Sync {
19 /// Get the capability name
20 fn name(&self) -> &str;
21
22 /// Check if this capability is available in the given context
23 fn is_available(&self, context: &ExecutionContext) -> bool;
24
25 /// Execute the capability
26 ///
27 /// # Arguments
28 /// * `context` - Execution context
29 /// * `parameters` - Capability-specific parameters
30 ///
31 /// # Returns
32 /// * `Ok(CapabilityResult)` - Capability execution result
33 /// * `Err(CapabilityError)` - Capability execution error
34 async fn execute(
35 &self,
36 context: &mut ExecutionContext,
37 parameters: &HashMap<String, serde_json::Value>,
38 ) -> Result<CapabilityResult, CapabilityError>;
39}
40
41/// Capability Result
42///
43/// Result of executing a capability.
44#[derive(Debug, Clone)]
45pub struct CapabilityResult {
46 /// Output data
47 pub output: HashMap<String, serde_json::Value>,
48 /// Whether the capability execution was successful
49 pub success: bool,
50}
51
52/// Capability Error
53///
54/// Error that occurred during capability execution.
55#[derive(Debug, thiserror::Error)]
56pub enum CapabilityError {
57 #[error("Capability execution failed: {0}")]
58 ExecutionFailed(String),
59 #[error("Capability not available: {0}")]
60 NotAvailable(String),
61 #[error("Invalid parameters: {0}")]
62 InvalidParameters(String),
63}
64
65/// Capability Provider
66///
67/// Trait for elements that provide capabilities.
68pub trait CapabilityProvider: Send + Sync {
69 /// Get all capabilities provided by this element
70 fn get_capabilities(&self) -> Vec<Box<dyn Capability>>;
71}
72