Skip to main content

swf_builders/services/task/
mod.rs

1use serde_json::Value;
2use std::collections::HashMap;
3use swf_core::models::authentication::{
4    AuthenticationPolicyReference, ReferenceableAuthenticationPolicy,
5};
6use swf_core::models::call::CallTaskDefinition;
7use swf_core::models::call::{
8    A2AArguments, AsyncApiArguments, CallA2ADefinition, CallAsyncAPIDefinition,
9    CallFunctionDefinition, CallGRPCDefinition, CallHTTPDefinition, CallOpenAPIDefinition,
10    GRPCArguments, GRPCServiceDefinition, HTTPArguments, OneOfA2AParametersOrExpression,
11    OneOfHeadersOrExpression, OneOfQueryOrExpression, OpenAPIArguments,
12};
13use swf_core::models::duration::*;
14use swf_core::models::error::ErrorType;
15use swf_core::models::error::*;
16use swf_core::models::event::*;
17use swf_core::models::input::*;
18use swf_core::models::output::*;
19use swf_core::models::resource::{ExternalResourceDefinition, OneOfEndpointDefinitionOrUri};
20use swf_core::models::retry::*;
21use swf_core::models::task::*;
22use swf_core::models::timeout::*;
23
24use super::timeout::TimeoutDefinitionBuilder;
25
26/// Macro to generate the `pub fn variant()` method for TaskDefinitionBuilder,
27/// creating the builder, storing it, and returning a mutable reference.
28macro_rules! task_variant_method {
29    ($method:ident, $variant:ident, $builder:ident $(, $arg:ident: $arg_ty:ty)*) => {
30        pub fn $method(&mut self $(, $arg: $arg_ty)*) -> &mut $builder {
31            let builder = $builder::new($($arg),*);
32            self.builder = Some(TaskBuilderVariant::$variant(Box::new(builder)));
33            match &mut self.builder {
34                Some(TaskBuilderVariant::$variant(ref mut builder)) => builder,
35                _ => unreachable!(concat!("Builder should always be set to ", stringify!($variant))),
36            }
37        }
38    };
39}
40
41/// Implements `TaskDefinitionBuilderBase` for a builder struct, generating
42/// the 7 common methods (if_, with_timeout_reference, with_timeout,
43/// with_input, with_output, with_export, then) that all delegate to
44/// `self.$field.common`. The `build()` method is unique per builder
45/// and must be provided via the `$build_expr` expression, which will
46/// be evaluated in a context where `v` holds the inner field value.
47macro_rules! impl_task_definition_builder_base {
48    ($builder:ident, $field:ident, $build_expr:expr) => {
49        impl TaskDefinitionBuilderBase for $builder {
50            fn if_(&mut self, condition: &str) -> &mut Self {
51                self.$field.common.if_ = Some(condition.to_string());
52                self
53            }
54
55            fn with_timeout_reference(&mut self, reference: &str) -> &mut Self {
56                self.$field.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(
57                    reference.to_string(),
58                ));
59                self
60            }
61
62            fn with_timeout<F>(&mut self, setup: F) -> &mut Self
63            where
64                F: FnOnce(&mut TimeoutDefinitionBuilder),
65            {
66                let mut builder = TimeoutDefinitionBuilder::new();
67                setup(&mut builder);
68                let timeout = builder.build();
69                self.$field.common.timeout =
70                    Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
71                self
72            }
73
74            fn with_input<F>(&mut self, setup: F) -> &mut Self
75            where
76                F: FnOnce(&mut InputDataModelDefinitionBuilder),
77            {
78                let mut builder = InputDataModelDefinitionBuilder::new();
79                setup(&mut builder);
80                self.$field.common.input = Some(builder.build());
81                self
82            }
83
84            fn with_output<F>(&mut self, setup: F) -> &mut Self
85            where
86                F: FnOnce(&mut OutputDataModelDefinitionBuilder),
87            {
88                let mut builder = OutputDataModelDefinitionBuilder::new();
89                setup(&mut builder);
90                self.$field.common.output = Some(builder.build());
91                self
92            }
93
94            fn with_export<F>(&mut self, setup: F) -> &mut Self
95            where
96                F: FnOnce(&mut OutputDataModelDefinitionBuilder),
97            {
98                let mut builder = OutputDataModelDefinitionBuilder::new();
99                setup(&mut builder);
100                self.$field.common.export = Some(builder.build());
101                self
102            }
103
104            fn then(&mut self, directive: &str) -> &mut Self {
105                self.$field.common.then = Some(directive.to_string());
106                self
107            }
108
109            fn build(self) -> TaskDefinition {
110                $build_expr(self.$field)
111            }
112        }
113    };
114}
115
116mod call;
117mod common;
118mod do_task;
119mod emit;
120mod for_loop;
121mod fork;
122mod listen;
123mod raise;
124mod run;
125mod set;
126mod switch;
127mod task_builder;
128mod try_catch;
129mod wait;
130
131pub use call::*;
132pub use common::*;
133pub use do_task::*;
134pub use emit::*;
135pub use for_loop::*;
136pub use fork::*;
137pub use listen::*;
138pub use raise::*;
139pub use run::*;
140pub use set::*;
141pub use switch::*;
142pub use task_builder::*;
143pub use try_catch::*;
144pub use wait::*;