1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3pub enum SubscribeNamespaceState {
4 Idle,
6 Pending,
8 Active,
10 Done,
12}
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub enum PublishNamespaceState {
17 Idle,
19 Pending,
21 Active,
23 Done,
25}
26
27#[derive(Debug, thiserror::Error, PartialEq, Eq)]
29pub enum NamespaceError {
30 #[error("invalid transition from {from} on event {event}")]
32 InvalidTransition {
33 from: String,
35 event: String,
37 },
38}
39
40pub struct SubscribeNamespaceStateMachine {
43 state: SubscribeNamespaceState,
44}
45
46impl Default for SubscribeNamespaceStateMachine {
47 fn default() -> Self {
48 Self::new()
49 }
50}
51
52impl SubscribeNamespaceStateMachine {
53 pub fn new() -> Self {
55 Self { state: SubscribeNamespaceState::Idle }
56 }
57
58 pub fn state(&self) -> SubscribeNamespaceState {
60 self.state
61 }
62
63 pub fn on_subscribe_namespace_sent(&mut self) -> Result<(), NamespaceError> {
65 if self.state == SubscribeNamespaceState::Idle {
66 self.state = SubscribeNamespaceState::Pending;
67 Ok(())
68 } else {
69 Err(NamespaceError::InvalidTransition {
70 from: format!("{:?}", self.state),
71 event: "on_subscribe_namespace_sent".to_string(),
72 })
73 }
74 }
75
76 pub fn on_subscribe_namespace_ok(&mut self) -> Result<(), NamespaceError> {
78 if self.state == SubscribeNamespaceState::Pending {
79 self.state = SubscribeNamespaceState::Active;
80 Ok(())
81 } else {
82 Err(NamespaceError::InvalidTransition {
83 from: format!("{:?}", self.state),
84 event: "on_subscribe_namespace_ok".to_string(),
85 })
86 }
87 }
88
89 pub fn on_subscribe_namespace_error(&mut self) -> Result<(), NamespaceError> {
91 if self.state == SubscribeNamespaceState::Pending {
92 self.state = SubscribeNamespaceState::Done;
93 Ok(())
94 } else {
95 Err(NamespaceError::InvalidTransition {
96 from: format!("{:?}", self.state),
97 event: "on_subscribe_namespace_error".to_string(),
98 })
99 }
100 }
101
102 pub fn on_request_cancelled(&mut self) -> Result<(), NamespaceError> {
120 match self.state {
121 SubscribeNamespaceState::Pending | SubscribeNamespaceState::Active => {
122 self.state = SubscribeNamespaceState::Done;
123 Ok(())
124 }
125 SubscribeNamespaceState::Done => Ok(()),
126 SubscribeNamespaceState::Idle => Err(NamespaceError::InvalidTransition {
127 from: format!("{:?}", self.state),
128 event: "on_request_cancelled".to_string(),
129 }),
130 }
131 }
132
133 pub fn on_subscribe_namespace_received(&mut self) -> Result<(), NamespaceError> {
141 if self.state == SubscribeNamespaceState::Idle {
142 self.state = SubscribeNamespaceState::Pending;
143 Ok(())
144 } else {
145 Err(NamespaceError::InvalidTransition {
146 from: format!("{:?}", self.state),
147 event: "on_subscribe_namespace_received".to_string(),
148 })
149 }
150 }
151
152 pub fn on_subscribe_namespace_ok_sent(&mut self) -> Result<(), NamespaceError> {
155 if self.state == SubscribeNamespaceState::Pending {
156 self.state = SubscribeNamespaceState::Active;
157 Ok(())
158 } else {
159 Err(NamespaceError::InvalidTransition {
160 from: format!("{:?}", self.state),
161 event: "on_subscribe_namespace_ok_sent".to_string(),
162 })
163 }
164 }
165
166 pub fn on_subscribe_namespace_error_sent(&mut self) -> Result<(), NamespaceError> {
168 if self.state == SubscribeNamespaceState::Pending {
169 self.state = SubscribeNamespaceState::Done;
170 Ok(())
171 } else {
172 Err(NamespaceError::InvalidTransition {
173 from: format!("{:?}", self.state),
174 event: "on_subscribe_namespace_error_sent".to_string(),
175 })
176 }
177 }
178}
179
180pub struct PublishNamespaceStateMachine {
183 state: PublishNamespaceState,
184}
185
186impl Default for PublishNamespaceStateMachine {
187 fn default() -> Self {
188 Self::new()
189 }
190}
191
192impl PublishNamespaceStateMachine {
193 pub fn new() -> Self {
195 Self { state: PublishNamespaceState::Idle }
196 }
197
198 pub fn state(&self) -> PublishNamespaceState {
200 self.state
201 }
202
203 pub fn on_publish_namespace_sent(&mut self) -> Result<(), NamespaceError> {
205 if self.state == PublishNamespaceState::Idle {
206 self.state = PublishNamespaceState::Pending;
207 Ok(())
208 } else {
209 Err(NamespaceError::InvalidTransition {
210 from: format!("{:?}", self.state),
211 event: "on_publish_namespace_sent".to_string(),
212 })
213 }
214 }
215
216 pub fn on_publish_namespace_ok(&mut self) -> Result<(), NamespaceError> {
218 if self.state == PublishNamespaceState::Pending {
219 self.state = PublishNamespaceState::Active;
220 Ok(())
221 } else {
222 Err(NamespaceError::InvalidTransition {
223 from: format!("{:?}", self.state),
224 event: "on_publish_namespace_ok".to_string(),
225 })
226 }
227 }
228
229 pub fn on_publish_namespace_error(&mut self) -> Result<(), NamespaceError> {
231 if self.state == PublishNamespaceState::Pending {
232 self.state = PublishNamespaceState::Done;
233 Ok(())
234 } else {
235 Err(NamespaceError::InvalidTransition {
236 from: format!("{:?}", self.state),
237 event: "on_publish_namespace_error".to_string(),
238 })
239 }
240 }
241
242 pub fn on_publish_namespace_done(&mut self) -> Result<(), NamespaceError> {
244 if self.state == PublishNamespaceState::Active {
245 self.state = PublishNamespaceState::Done;
246 Ok(())
247 } else {
248 Err(NamespaceError::InvalidTransition {
249 from: format!("{:?}", self.state),
250 event: "on_publish_namespace_done".to_string(),
251 })
252 }
253 }
254
255 pub fn on_publish_namespace_cancel(&mut self) -> Result<(), NamespaceError> {
257 if self.state == PublishNamespaceState::Active {
258 self.state = PublishNamespaceState::Done;
259 Ok(())
260 } else {
261 Err(NamespaceError::InvalidTransition {
262 from: format!("{:?}", self.state),
263 event: "on_publish_namespace_cancel".to_string(),
264 })
265 }
266 }
267}
268
269impl PublishNamespaceStateMachine {
278 pub fn on_publish_namespace_received(&mut self) -> Result<(), NamespaceError> {
280 self.on_publish_namespace_sent().map_err(|_| NamespaceError::InvalidTransition {
281 from: format!("{:?}", self.state()),
282 event: "on_publish_namespace_received".to_string(),
283 })
284 }
285
286 pub fn on_publish_namespace_ok_sent(&mut self) -> Result<(), NamespaceError> {
288 self.on_publish_namespace_ok().map_err(|_| NamespaceError::InvalidTransition {
289 from: format!("{:?}", self.state()),
290 event: "on_publish_namespace_ok_sent".to_string(),
291 })
292 }
293
294 pub fn on_publish_namespace_error_sent(&mut self) -> Result<(), NamespaceError> {
296 self.on_publish_namespace_error().map_err(|_| NamespaceError::InvalidTransition {
297 from: format!("{:?}", self.state()),
298 event: "on_publish_namespace_error_sent".to_string(),
299 })
300 }
301
302 pub fn on_publish_namespace_done_received(&mut self) -> Result<(), NamespaceError> {
304 self.on_publish_namespace_done().map_err(|_| NamespaceError::InvalidTransition {
305 from: format!("{:?}", self.state()),
306 event: "on_publish_namespace_done_received".to_string(),
307 })
308 }
309
310 pub fn on_publish_namespace_cancel_sent(&mut self) -> Result<(), NamespaceError> {
316 self.on_publish_namespace_cancel().map_err(|_| NamespaceError::InvalidTransition {
317 from: format!("{:?}", self.state()),
318 event: "on_publish_namespace_cancel_sent".to_string(),
319 })
320 }
321}