1use std::marker::PhantomData;
10use std::time::Duration;
11
12use crate::attribute::AttributeLock;
13use crate::{RetryPolicy, Step, Value};
14
15pub struct StepOptions<Input> {
35 pub(crate) wait_for_method_timeout: Option<Duration>,
36 pub(crate) execute_method_timeout: Option<Duration>,
37 pub(crate) wait_for_retry: Option<RetryPolicy>,
38 pub(crate) execute_retry: Option<RetryPolicy>,
39 pub(crate) wait_for_failure: WaitForFailurePolicy,
40 pub(crate) wait_for_durability: StepDurability,
41 pub(crate) execute_durability: StepDurability,
42 pub(crate) wait_for_locks: Vec<AttributeLock>,
43 pub(crate) execute_locks: Vec<AttributeLock>,
44 pub(crate) execute_failure_step: Option<&'static str>,
45 marker: PhantomData<fn(Input)>,
46}
47
48#[derive(Clone)]
49pub(crate) struct ErasedStepOptions {
50 pub(crate) wait_for_method_timeout: Option<Duration>,
51 pub(crate) execute_method_timeout: Option<Duration>,
52 pub(crate) wait_for_retry: Option<RetryPolicy>,
53 pub(crate) execute_retry: Option<RetryPolicy>,
54 pub(crate) wait_for_failure: WaitForFailurePolicy,
55 pub(crate) wait_for_durability: StepDurability,
56 pub(crate) execute_durability: StepDurability,
57 pub(crate) wait_for_locks: Vec<AttributeLock>,
58 pub(crate) execute_locks: Vec<AttributeLock>,
59 pub(crate) execute_failure_step: Option<&'static str>,
60}
61
62impl<Input> From<StepOptions<Input>> for ErasedStepOptions {
63 fn from(options: StepOptions<Input>) -> Self {
64 Self {
65 wait_for_method_timeout: options.wait_for_method_timeout,
66 execute_method_timeout: options.execute_method_timeout,
67 wait_for_retry: options.wait_for_retry,
68 execute_retry: options.execute_retry,
69 wait_for_failure: options.wait_for_failure,
70 wait_for_durability: options.wait_for_durability,
71 execute_durability: options.execute_durability,
72 wait_for_locks: options.wait_for_locks,
73 execute_locks: options.execute_locks,
74 execute_failure_step: options.execute_failure_step,
75 }
76 }
77}
78
79impl<Input: Value> StepOptions<Input> {
80 pub fn new() -> Self {
82 Self {
83 wait_for_method_timeout: None,
84 execute_method_timeout: None,
85 wait_for_retry: None,
86 execute_retry: None,
87 wait_for_failure: WaitForFailurePolicy::FailFlow,
88 wait_for_durability: StepDurability::Default,
89 execute_durability: StepDurability::Default,
90 wait_for_locks: Vec::new(),
91 execute_locks: Vec::new(),
92 execute_failure_step: None,
93 marker: PhantomData,
94 }
95 }
96
97 pub fn wait_for_method_timeout(mut self, value: Duration) -> Self {
99 self.wait_for_method_timeout = Some(value);
100 self
101 }
102
103 pub fn execute_method_timeout(mut self, value: Duration) -> Self {
105 self.execute_method_timeout = Some(value);
106 self
107 }
108
109 pub fn wait_for_retry(mut self, value: RetryPolicy) -> Self {
111 self.wait_for_retry = Some(value);
112 self
113 }
114
115 pub fn execute_retry(mut self, value: RetryPolicy) -> Self {
117 self.execute_retry = Some(value);
118 self
119 }
120
121 pub fn wait_for_failure(mut self, value: WaitForFailurePolicy) -> Self {
123 self.wait_for_failure = value;
124 self
125 }
126
127 pub fn on_execute_failure_proceed_to<RecoveryStep>(mut self, step: &RecoveryStep) -> Self
129 where
130 RecoveryStep: Step<Input = Input>,
131 {
132 self.execute_failure_step = Some(step.step_type());
133 self
134 }
135
136 pub fn wait_for_durability(mut self, value: StepDurability) -> Self {
138 self.wait_for_durability = value;
139 self
140 }
141
142 pub fn execute_durability(mut self, value: StepDurability) -> Self {
144 self.execute_durability = value;
145 self
146 }
147
148 pub fn wait_for_lock(mut self, value: AttributeLock) -> Self {
150 self.wait_for_locks.push(value);
151 self
152 }
153
154 pub fn execute_lock(mut self, value: AttributeLock) -> Self {
156 self.execute_locks.push(value);
157 self
158 }
159}
160
161impl<Input: Value> Default for StepOptions<Input> {
162 fn default() -> Self {
163 Self::new()
164 }
165}
166
167#[derive(Clone, Copy, Debug, Eq, PartialEq)]
168pub enum WaitForFailurePolicy {
170 FailFlow,
172 Proceed,
174}
175
176#[derive(Clone, Copy, Debug, Eq, PartialEq)]
177pub enum StepDurability {
179 Default,
181 Sync,
183 Async,
185}