feat(wfe-core): add add_step_typed() and make wire_outcome public
Adds WorkflowBuilder::add_step_typed<S>() for adding named, configured steps directly — needed for parallel branch closures in the CLI. Makes wire_outcome() public so callers can wire custom step graphs.
This commit is contained in:
20
Cargo.toml
20
Cargo.toml
@@ -3,7 +3,7 @@ members = ["wfe-core", "wfe-sqlite", "wfe-postgres", "wfe-opensearch", "wfe-valk
|
||||
resolver = "2"
|
||||
|
||||
[workspace.package]
|
||||
version = "1.6.1"
|
||||
version = "1.6.2"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
repository = "https://src.sunbeam.pt/studio/wfe"
|
||||
@@ -38,15 +38,15 @@ redis = { version = "0.27", features = ["tokio-comp", "connection-manager"] }
|
||||
opensearch = "2"
|
||||
|
||||
# Internal crates
|
||||
wfe-core = { version = "1.6.1", path = "wfe-core", registry = "sunbeam" }
|
||||
wfe-sqlite = { version = "1.6.1", path = "wfe-sqlite", registry = "sunbeam" }
|
||||
wfe-postgres = { version = "1.6.1", path = "wfe-postgres", registry = "sunbeam" }
|
||||
wfe-opensearch = { version = "1.6.1", path = "wfe-opensearch", registry = "sunbeam" }
|
||||
wfe-valkey = { version = "1.6.1", path = "wfe-valkey", registry = "sunbeam" }
|
||||
wfe-yaml = { version = "1.6.1", path = "wfe-yaml", registry = "sunbeam" }
|
||||
wfe-buildkit = { version = "1.6.1", path = "wfe-buildkit", registry = "sunbeam" }
|
||||
wfe-containerd = { version = "1.6.1", path = "wfe-containerd", registry = "sunbeam" }
|
||||
wfe-rustlang = { version = "1.6.1", path = "wfe-rustlang", registry = "sunbeam" }
|
||||
wfe-core = { version = "1.6.2", path = "wfe-core", registry = "sunbeam" }
|
||||
wfe-sqlite = { version = "1.6.2", path = "wfe-sqlite", registry = "sunbeam" }
|
||||
wfe-postgres = { version = "1.6.2", path = "wfe-postgres", registry = "sunbeam" }
|
||||
wfe-opensearch = { version = "1.6.2", path = "wfe-opensearch", registry = "sunbeam" }
|
||||
wfe-valkey = { version = "1.6.2", path = "wfe-valkey", registry = "sunbeam" }
|
||||
wfe-yaml = { version = "1.6.2", path = "wfe-yaml", registry = "sunbeam" }
|
||||
wfe-buildkit = { version = "1.6.2", path = "wfe-buildkit", registry = "sunbeam" }
|
||||
wfe-containerd = { version = "1.6.2", path = "wfe-containerd", registry = "sunbeam" }
|
||||
wfe-rustlang = { version = "1.6.2", path = "wfe-rustlang", registry = "sunbeam" }
|
||||
|
||||
# YAML
|
||||
serde_yaml = "0.9"
|
||||
|
||||
@@ -61,8 +61,23 @@ impl<D: WorkflowData> WorkflowBuilder<D> {
|
||||
id
|
||||
}
|
||||
|
||||
/// Add a typed step with an optional name and config.
|
||||
/// Convenience for use inside `parallel` branch closures.
|
||||
pub fn add_step_typed<S: StepBody + Default + 'static>(
|
||||
&mut self,
|
||||
name: &str,
|
||||
config: Option<serde_json::Value>,
|
||||
) -> usize {
|
||||
let id = self.add_step(std::any::type_name::<S>());
|
||||
self.steps[id].name = Some(name.to_string());
|
||||
if let Some(cfg) = config {
|
||||
self.steps[id].step_config = Some(cfg);
|
||||
}
|
||||
id
|
||||
}
|
||||
|
||||
/// Wire an outcome from `from_step` to `to_step`.
|
||||
pub(crate) fn wire_outcome(&mut self, from_step: usize, to_step: usize, value: Option<serde_json::Value>) {
|
||||
pub fn wire_outcome(&mut self, from_step: usize, to_step: usize, value: Option<serde_json::Value>) {
|
||||
if let Some(step) = self.steps.get_mut(from_step) {
|
||||
step.outcomes.push(StepOutcome {
|
||||
next_step: to_step,
|
||||
@@ -386,6 +401,34 @@ mod tests {
|
||||
assert_eq!(def.steps[0].step_type, def.steps[1].step_type);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn add_step_typed_sets_name_and_config() {
|
||||
let cfg = serde_json::json!({"namespace": "ory"});
|
||||
let mut builder = WorkflowBuilder::<TestData>::new();
|
||||
let id = builder.add_step_typed::<StepA>("apply-ory", Some(cfg.clone()));
|
||||
assert_eq!(builder.steps[id].name, Some("apply-ory".into()));
|
||||
assert_eq!(builder.steps[id].step_config, Some(cfg));
|
||||
assert!(builder.steps[id].step_type.contains("StepA"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn add_step_typed_without_config() {
|
||||
let mut builder = WorkflowBuilder::<TestData>::new();
|
||||
let id = builder.add_step_typed::<StepB>("my-step", None);
|
||||
assert_eq!(builder.steps[id].name, Some("my-step".into()));
|
||||
assert_eq!(builder.steps[id].step_config, None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn wire_outcome_connects_steps() {
|
||||
let mut builder = WorkflowBuilder::<TestData>::new();
|
||||
let id0 = builder.add_step_typed::<StepA>("first", None);
|
||||
let id1 = builder.add_step_typed::<StepB>("second", None);
|
||||
builder.wire_outcome(id0, id1, None);
|
||||
assert_eq!(builder.steps[id0].outcomes.len(), 1);
|
||||
assert_eq!(builder.steps[id0].outcomes[0].next_step, id1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn inline_step_via_then_fn() {
|
||||
let def = WorkflowBuilder::<TestData>::new()
|
||||
|
||||
Reference in New Issue
Block a user