use std::any::TypeId;
use std::time::Duration;
use crate::start_flow_options::InitialAttribute;
use crate::wait::SubFlowDefinition;
use crate::{
Attribute, AttributeMap, Condition, Context, Flow, FlowConfig, FlowResult,
FlowTimeoutHandlerOptions, FlowTimeoutPolicy, HandlerResult, RetryPolicy, SdkResult, Value,
value_mapper,
};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum SubFlowReusePolicy {
Attach,
RestartIfPreviousExitsAbnormally,
AlwaysRestart,
}
#[derive(Clone)]
pub struct SubFlowOptions {
pub(crate) timeout: Option<Duration>,
pub(crate) timeout_policy: FlowTimeoutPolicy,
pub(crate) timeout_handler_options: Option<FlowTimeoutHandlerOptions>,
pub(crate) start_delay: Option<Duration>,
pub(crate) retry_policy: Option<RetryPolicy>,
pub(crate) config_override: Option<FlowConfig>,
pub(crate) attributes: Vec<InitialAttribute>,
pub(crate) reuse_policy: SubFlowReusePolicy,
pub(crate) condition_id: Option<String>,
}
impl SubFlowOptions {
pub fn new() -> Self {
Self {
timeout: None,
timeout_policy: FlowTimeoutPolicy::Default,
timeout_handler_options: None,
start_delay: None,
retry_policy: None,
config_override: None,
attributes: Vec::new(),
reuse_policy: SubFlowReusePolicy::RestartIfPreviousExitsAbnormally,
condition_id: None,
}
}
pub fn timeout(mut self, value: Duration) -> Self {
self.timeout = Some(value);
self
}
pub fn timeout_policy(mut self, value: FlowTimeoutPolicy) -> Self {
self.timeout_policy = value;
self
}
pub fn timeout_handler_options(mut self, value: FlowTimeoutHandlerOptions) -> Self {
self.timeout_handler_options = Some(value);
self
}
pub fn start_delay(mut self, value: Duration) -> Self {
self.start_delay = Some(value);
self
}
pub fn retry_policy(mut self, value: RetryPolicy) -> Self {
self.retry_policy = Some(value);
self
}
pub fn config_override(mut self, value: FlowConfig) -> Self {
self.config_override = Some(value);
self
}
pub fn reuse_policy(mut self, value: SubFlowReusePolicy) -> Self {
self.reuse_policy = value;
self
}
pub fn condition_id(mut self, value: impl Into<String>) -> Self {
self.condition_id = Some(value.into());
self
}
pub fn initial_attribute<T: Value>(mut self, attribute: &Attribute<T>, value: T) -> Self {
self.attributes
.push(InitialAttribute::for_attribute(attribute, value));
self
}
pub fn initial_attribute_map<T: Value>(
mut self,
attribute: &AttributeMap<T>,
instance: &str,
value: T,
) -> Self {
self.attributes.push(InitialAttribute::for_attribute_map(
attribute, instance, value,
));
self
}
}
impl Default for SubFlowOptions {
fn default() -> Self {
Self::new()
}
}
pub struct SubFlow;
impl SubFlow {
pub fn run<SomeFlow: Flow>(
flow: &SomeFlow,
input: SomeFlow::StartInput,
) -> SdkResult<Condition> {
Self::run_with_options(flow, input, SubFlowOptions::new())
}
pub fn run_with_options<SomeFlow: Flow>(
flow: &SomeFlow,
input: SomeFlow::StartInput,
options: SubFlowOptions,
) -> SdkResult<Condition> {
Ok(Condition::sub_flow(SubFlowDefinition {
flow_type: flow.flow_type(),
type_id: TypeId::of::<SomeFlow>(),
input: value_mapper::encode(&input)?,
options,
}))
}
pub fn condition_result(context: &Context) -> HandlerResult<FlowResult> {
Self::condition_result_at(context, 0)
}
pub fn condition_result_at(context: &Context, index: usize) -> HandlerResult<FlowResult> {
context.sub_flow_result(index)
}
pub fn flow_id(context: &Context) -> HandlerResult<String> {
Self::flow_id_at(context, 0)
}
pub fn flow_id_at(context: &Context, index: usize) -> HandlerResult<String> {
context.sub_flow_id(index)
}
}