Skip to main content

swf_builders/services/task/
raise.rs

1use super::*;
2
3// ============== RaiseErrorDefinitionBuilder ==============
4/// Builder for constructing an error definition used in raise tasks.
5pub struct RaiseErrorDefinitionBuilder {
6    error: ErrorDefinition,
7}
8
9impl RaiseErrorDefinitionBuilder {
10    pub fn new() -> Self {
11        Self {
12            error: ErrorDefinition::default(),
13        }
14    }
15
16    /// Sets the error type URI template.
17    pub fn with_type(&mut self, type_: &str) -> &mut Self {
18        self.error.type_ = ErrorType::uri_template(type_);
19        self
20    }
21
22    /// Sets the error status value.
23    pub fn with_status(&mut self, status: Value) -> &mut Self {
24        self.error.status = status;
25        self
26    }
27
28    /// Sets the error title.
29    pub fn with_title(&mut self, title: &str) -> &mut Self {
30        self.error.title = Some(title.to_string());
31        self
32    }
33
34    /// Sets the error detail message.
35    pub fn with_detail(&mut self, detail: &str) -> &mut Self {
36        self.error.detail = Some(detail.to_string());
37        self
38    }
39
40    /// Sets the error instance URI.
41    pub fn with_instance(&mut self, instance: &str) -> &mut Self {
42        self.error.instance = Some(instance.to_string());
43        self
44    }
45
46    /// Builds the error definition as an inline definition (not a reference).
47    pub fn build(self) -> OneOfErrorDefinitionOrReference {
48        OneOfErrorDefinitionOrReference::Error(self.error)
49    }
50}
51
52impl Default for RaiseErrorDefinitionBuilder {
53    fn default() -> Self {
54        Self::new()
55    }
56}
57
58// ============== RaiseTaskDefinitionBuilder ==============
59/// Builder for constructing a raise task that produces an error.
60#[derive(Default)]
61pub struct RaiseTaskDefinitionBuilder {
62    task: RaiseTaskDefinition,
63    error_builder: Option<RaiseErrorDefinitionBuilder>,
64}
65
66impl RaiseTaskDefinitionBuilder {
67    pub fn new() -> Self {
68        Self::default()
69    }
70
71    /// Creates an inline error definition using a builder.
72    pub fn error(&mut self) -> &mut RaiseErrorDefinitionBuilder {
73        self.error_builder = Some(RaiseErrorDefinitionBuilder::new());
74        self.get_error_builder()
75    }
76
77    /// References a named error definition instead of defining one inline.
78    pub fn error_reference(&mut self, ref_name: &str) -> &mut Self {
79        self.task.raise.error = OneOfErrorDefinitionOrReference::Reference(ref_name.to_string());
80        self.error_builder = None;
81        self
82    }
83
84    fn get_error_builder(&mut self) -> &mut RaiseErrorDefinitionBuilder {
85        if let Some(ref mut builder) = self.error_builder {
86            builder
87        } else {
88            unreachable!("Error builder should be set")
89        }
90    }
91}
92
93impl TaskDefinitionBuilderBase for RaiseTaskDefinitionBuilder {
94    fn if_(&mut self, condition: &str) -> &mut Self {
95        self.task.common.if_ = Some(condition.to_string());
96        self
97    }
98
99    fn with_timeout_reference(&mut self, reference: &str) -> &mut Self {
100        self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(
101            reference.to_string(),
102        ));
103        self
104    }
105
106    fn with_timeout<F>(&mut self, setup: F) -> &mut Self
107    where
108        F: FnOnce(&mut TimeoutDefinitionBuilder),
109    {
110        let mut builder = TimeoutDefinitionBuilder::new();
111        setup(&mut builder);
112        let timeout = builder.build();
113        self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
114        self
115    }
116
117    fn with_input<F>(&mut self, setup: F) -> &mut Self
118    where
119        F: FnOnce(&mut InputDataModelDefinitionBuilder),
120    {
121        let mut builder = InputDataModelDefinitionBuilder::new();
122        setup(&mut builder);
123        self.task.common.input = Some(builder.build());
124        self
125    }
126
127    fn with_output<F>(&mut self, setup: F) -> &mut Self
128    where
129        F: FnOnce(&mut OutputDataModelDefinitionBuilder),
130    {
131        let mut builder = OutputDataModelDefinitionBuilder::new();
132        setup(&mut builder);
133        self.task.common.output = Some(builder.build());
134        self
135    }
136
137    fn with_export<F>(&mut self, setup: F) -> &mut Self
138    where
139        F: FnOnce(&mut OutputDataModelDefinitionBuilder),
140    {
141        let mut builder = OutputDataModelDefinitionBuilder::new();
142        setup(&mut builder);
143        self.task.common.export = Some(builder.build());
144        self
145    }
146
147    fn then(&mut self, directive: &str) -> &mut Self {
148        self.task.common.then = Some(directive.to_string());
149        self
150    }
151
152    fn build(mut self) -> TaskDefinition {
153        if let Some(error_builder) = self.error_builder.take() {
154            self.task.raise.error = error_builder.build();
155        }
156        TaskDefinition::Raise(self.task)
157    }
158}