1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3pub enum SubscribeAnnouncesState {
4 Idle,
6 Pending,
8 Active,
10 Done,
12}
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub enum AnnounceState {
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 SubscribeAnnouncesStateMachine {
43 state: SubscribeAnnouncesState,
44}
45
46impl Default for SubscribeAnnouncesStateMachine {
47 fn default() -> Self {
48 Self::new()
49 }
50}
51
52impl SubscribeAnnouncesStateMachine {
53 pub fn new() -> Self {
55 Self { state: SubscribeAnnouncesState::Idle }
56 }
57
58 pub fn state(&self) -> SubscribeAnnouncesState {
60 self.state
61 }
62
63 pub fn on_subscribe_announces_sent(&mut self) -> Result<(), NamespaceError> {
65 if self.state == SubscribeAnnouncesState::Idle {
66 self.state = SubscribeAnnouncesState::Pending;
67 Ok(())
68 } else {
69 Err(NamespaceError::InvalidTransition {
70 from: format!("{:?}", self.state),
71 event: "on_subscribe_announces_sent".to_string(),
72 })
73 }
74 }
75
76 pub fn on_subscribe_announces_ok(&mut self) -> Result<(), NamespaceError> {
78 if self.state == SubscribeAnnouncesState::Pending {
79 self.state = SubscribeAnnouncesState::Active;
80 Ok(())
81 } else {
82 Err(NamespaceError::InvalidTransition {
83 from: format!("{:?}", self.state),
84 event: "on_subscribe_announces_ok".to_string(),
85 })
86 }
87 }
88
89 pub fn on_subscribe_announces_error(&mut self) -> Result<(), NamespaceError> {
91 if self.state == SubscribeAnnouncesState::Pending {
92 self.state = SubscribeAnnouncesState::Done;
93 Ok(())
94 } else {
95 Err(NamespaceError::InvalidTransition {
96 from: format!("{:?}", self.state),
97 event: "on_subscribe_announces_error".to_string(),
98 })
99 }
100 }
101
102 pub fn on_unsubscribe_announces(&mut self) -> Result<(), NamespaceError> {
104 if self.state == SubscribeAnnouncesState::Active {
105 self.state = SubscribeAnnouncesState::Done;
106 Ok(())
107 } else {
108 Err(NamespaceError::InvalidTransition {
109 from: format!("{:?}", self.state),
110 event: "on_unsubscribe_announces".to_string(),
111 })
112 }
113 }
114
115 pub fn on_subscribe_announces_received(&mut self) -> Result<(), NamespaceError> {
123 self.on_subscribe_announces_sent().map_err(|_| NamespaceError::InvalidTransition {
124 from: format!("{:?}", self.state()),
125 event: "on_subscribe_announces_received".to_string(),
126 })
127 }
128
129 pub fn on_subscribe_announces_ok_sent(&mut self) -> Result<(), NamespaceError> {
138 self.on_subscribe_announces_ok().map_err(|_| NamespaceError::InvalidTransition {
139 from: format!("{:?}", self.state()),
140 event: "on_subscribe_announces_ok_sent".to_string(),
141 })
142 }
143
144 pub fn on_subscribe_announces_error_sent(&mut self) -> Result<(), NamespaceError> {
150 self.on_subscribe_announces_error().map_err(|_| NamespaceError::InvalidTransition {
151 from: format!("{:?}", self.state()),
152 event: "on_subscribe_announces_error_sent".to_string(),
153 })
154 }
155
156 pub fn on_unsubscribe_announces_received(&mut self) -> Result<(), NamespaceError> {
167 self.on_unsubscribe_announces().map_err(|_| NamespaceError::InvalidTransition {
168 from: format!("{:?}", self.state()),
169 event: "on_unsubscribe_announces_received".to_string(),
170 })
171 }
172}
173
174pub struct AnnounceStateMachine {
177 state: AnnounceState,
178}
179
180impl Default for AnnounceStateMachine {
181 fn default() -> Self {
182 Self::new()
183 }
184}
185
186impl AnnounceStateMachine {
187 pub fn new() -> Self {
189 Self { state: AnnounceState::Idle }
190 }
191
192 pub fn state(&self) -> AnnounceState {
194 self.state
195 }
196
197 pub fn on_announce_sent(&mut self) -> Result<(), NamespaceError> {
199 if self.state == AnnounceState::Idle {
200 self.state = AnnounceState::Pending;
201 Ok(())
202 } else {
203 Err(NamespaceError::InvalidTransition {
204 from: format!("{:?}", self.state),
205 event: "on_announce_sent".to_string(),
206 })
207 }
208 }
209
210 pub fn on_announce_ok(&mut self) -> Result<(), NamespaceError> {
212 if self.state == AnnounceState::Pending {
213 self.state = AnnounceState::Active;
214 Ok(())
215 } else {
216 Err(NamespaceError::InvalidTransition {
217 from: format!("{:?}", self.state),
218 event: "on_announce_ok".to_string(),
219 })
220 }
221 }
222
223 pub fn on_announce_error(&mut self) -> Result<(), NamespaceError> {
225 if self.state == AnnounceState::Pending {
226 self.state = AnnounceState::Done;
227 Ok(())
228 } else {
229 Err(NamespaceError::InvalidTransition {
230 from: format!("{:?}", self.state),
231 event: "on_announce_error".to_string(),
232 })
233 }
234 }
235
236 pub fn on_unannounce(&mut self) -> Result<(), NamespaceError> {
238 if self.state == AnnounceState::Active {
239 self.state = AnnounceState::Done;
240 Ok(())
241 } else {
242 Err(NamespaceError::InvalidTransition {
243 from: format!("{:?}", self.state),
244 event: "on_unannounce".to_string(),
245 })
246 }
247 }
248
249 pub fn on_announce_cancel(&mut self) -> Result<(), NamespaceError> {
251 if self.state == AnnounceState::Active {
252 self.state = AnnounceState::Done;
253 Ok(())
254 } else {
255 Err(NamespaceError::InvalidTransition {
256 from: format!("{:?}", self.state),
257 event: "on_announce_cancel".to_string(),
258 })
259 }
260 }
261}
262
263impl AnnounceStateMachine {
272 pub fn on_announce_received(&mut self) -> Result<(), NamespaceError> {
274 self.on_announce_sent().map_err(|_| NamespaceError::InvalidTransition {
275 from: format!("{:?}", self.state()),
276 event: "on_announce_received".to_string(),
277 })
278 }
279
280 pub fn on_announce_ok_sent(&mut self) -> Result<(), NamespaceError> {
282 self.on_announce_ok().map_err(|_| NamespaceError::InvalidTransition {
283 from: format!("{:?}", self.state()),
284 event: "on_announce_ok_sent".to_string(),
285 })
286 }
287
288 pub fn on_announce_error_sent(&mut self) -> Result<(), NamespaceError> {
290 self.on_announce_error().map_err(|_| NamespaceError::InvalidTransition {
291 from: format!("{:?}", self.state()),
292 event: "on_announce_error_sent".to_string(),
293 })
294 }
295
296 pub fn on_unannounce_received(&mut self) -> Result<(), NamespaceError> {
298 self.on_unannounce().map_err(|_| NamespaceError::InvalidTransition {
299 from: format!("{:?}", self.state()),
300 event: "on_unannounce_received".to_string(),
301 })
302 }
303
304 pub fn on_announce_cancel_sent(&mut self) -> Result<(), NamespaceError> {
310 self.on_announce_cancel().map_err(|_| NamespaceError::InvalidTransition {
311 from: format!("{:?}", self.state()),
312 event: "on_announce_cancel_sent".to_string(),
313 })
314 }
315}