Skip to main content

swf_builders/services/task/
switch.rs

1use super::*;
2
3// ============== SwitchTaskDefinitionBuilder ==============
4/// Builder for constructing a switch task that selects a branch based on conditions.
5#[derive(Default)]
6pub struct SwitchTaskDefinitionBuilder {
7    task: SwitchTaskDefinition,
8}
9
10impl SwitchTaskDefinitionBuilder {
11    pub fn new() -> Self {
12        Self::default()
13    }
14
15    /// Adds a named switch case using a builder callback.
16    pub fn case_<F>(&mut self, name: &str, setup: F) -> &mut Self
17    where
18        F: FnOnce(&mut SwitchCaseDefinitionBuilder),
19    {
20        let mut builder = SwitchCaseDefinitionBuilder::new();
21        setup(&mut builder);
22        let case_def = builder.build();
23        self.task.switch.add(name.to_string(), case_def);
24        self
25    }
26}
27
28impl_task_definition_builder_base!(SwitchTaskDefinitionBuilder, task, |v| {
29    TaskDefinition::Switch(v)
30});
31
32/// Builder for constructing a switch case definition.
33pub struct SwitchCaseDefinitionBuilder {
34    case_def: SwitchCaseDefinition,
35}
36
37impl SwitchCaseDefinitionBuilder {
38    pub fn new() -> Self {
39        Self {
40            case_def: SwitchCaseDefinition::default(),
41        }
42    }
43
44    /// Sets the condition expression for this case.
45    pub fn when(&mut self, when: &str) -> &mut Self {
46        self.case_def.when = Some(when.to_string());
47        self
48    }
49
50    /// Sets the flow directive to execute when this case matches.
51    pub fn then(&mut self, then: &str) -> &mut Self {
52        self.case_def.then = Some(then.to_string());
53        self
54    }
55
56    /// Builds the `SwitchCaseDefinition`.
57    pub fn build(self) -> SwitchCaseDefinition {
58        self.case_def
59    }
60}
61
62impl Default for SwitchCaseDefinitionBuilder {
63    fn default() -> Self {
64        Self::new()
65    }
66}