Skip to main content

swf_builders/services/task/
fork.rs

1use super::*;
2
3// ============== ForkTaskDefinitionBuilder ==============
4/// Builder for constructing a fork task that executes branches in parallel.
5#[derive(Default)]
6pub struct ForkTaskDefinitionBuilder {
7    task: ForkTaskDefinition,
8    branch_counter: usize,
9}
10
11impl ForkTaskDefinitionBuilder {
12    pub fn new() -> Self {
13        Self::default()
14    }
15
16    /// Sets whether branches compete (first to complete cancels the rest).
17    pub fn compete(&mut self, compete: bool) -> &mut Self {
18        self.task.fork.compete = compete;
19        self
20    }
21
22    /// Adds an auto-named branch (e.g., "branch-0", "branch-1").
23    pub fn branch<F>(&mut self, setup: F) -> &mut Self
24    where
25        F: FnOnce(&mut TaskDefinitionBuilder),
26    {
27        let mut builder = TaskDefinitionBuilder::new();
28        setup(&mut builder);
29        let task = builder.build();
30        let name = format!("branch-{}", self.branch_counter);
31        self.branch_counter += 1;
32        self.task.fork.branches.add(name, task);
33        self
34    }
35
36    /// Adds a named branch to the fork.
37    pub fn named_branch<F>(&mut self, name: &str, setup: F) -> &mut Self
38    where
39        F: FnOnce(&mut TaskDefinitionBuilder),
40    {
41        let mut builder = TaskDefinitionBuilder::new();
42        setup(&mut builder);
43        let task = builder.build();
44        self.task.fork.branches.add(name.to_string(), task);
45        self
46    }
47}
48
49impl_task_definition_builder_base!(ForkTaskDefinitionBuilder, task, TaskDefinition::Fork);