1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//! [`WorkflowHandler`] trait — dynamic workflows with context chaining.
//!
//! Implement this trait to define workflows where steps can reference
//! outputs from previous steps. The handler receives a [`WorkflowContext`]
//! that provides step execution methods with automatic persistence.
//!
//! # Examples
//!
//! ```no_run
//! use ironflow_engine::handler::WorkflowHandler;
//! use ironflow_engine::context::WorkflowContext;
//! use ironflow_engine::config::{ShellConfig, AgentStepConfig};
//! use ironflow_engine::error::EngineError;
//! use std::future::Future;
//! use std::pin::Pin;
//!
//! struct DeployWorkflow;
//!
//! impl WorkflowHandler for DeployWorkflow {
//! fn name(&self) -> &str {
//! "deploy"
//! }
//!
//! fn execute<'a>(
//! &'a self,
//! ctx: &'a mut WorkflowContext,
//! ) -> Pin<Box<dyn Future<Output = Result<(), EngineError>> + Send + 'a>> {
//! Box::pin(async move {
//! let build = ctx.shell("build", ShellConfig::new("cargo build --release")).await?;
//! let tests = ctx.shell("test", ShellConfig::new("cargo test")).await?;
//!
//! let review = ctx.agent("review", AgentStepConfig::new(
//! &format!("Build:\n{}\nTests:\n{}\nReview.",
//! build.output["stdout"], tests.output["stdout"])
//! )).await?;
//!
//! if review.output["value"].as_str().unwrap_or("").contains("LGTM") {
//! ctx.shell("deploy", ShellConfig::new("./deploy.sh")).await?;
//! }
//!
//! Ok(())
//! })
//! }
//! }
//! ```
use Future;
use Pin;
use Serialize;
use crateWorkflowContext;
use crateEngineError;
/// Boxed future returned by [`WorkflowHandler::execute`].
pub type HandlerFuture<'a> = ;
/// Metadata about a workflow, returned by [`WorkflowHandler::describe`].
///
/// Contains a human-readable description and optional Rust source code
/// for display in the dashboard.
/// A dynamic workflow handler with context-aware step chaining.
///
/// Implement this trait to define workflows where each step can use
/// the output of previous steps. Register handlers with
/// [`Engine::register`](crate::engine::Engine::register) and execute
/// them by name.
///
/// # Why `Pin<Box<dyn Future>>` instead of `async fn`?
///
/// The handler must be object-safe (`dyn WorkflowHandler`) to allow
/// registering different handler types in the engine's registry.