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> {
166 self.on_unsubscribe_announces().map_err(|_| NamespaceError::InvalidTransition {
167 from: format!("{:?}", self.state()),
168 event: "on_unsubscribe_announces_received".to_string(),
169 })
170 }
171}
172
173pub struct AnnounceStateMachine {
176 state: AnnounceState,
177}
178
179impl Default for AnnounceStateMachine {
180 fn default() -> Self {
181 Self::new()
182 }
183}
184
185impl AnnounceStateMachine {
186 pub fn new() -> Self {
188 Self { state: AnnounceState::Idle }
189 }
190
191 pub fn state(&self) -> AnnounceState {
193 self.state
194 }
195
196 pub fn on_announce_sent(&mut self) -> Result<(), NamespaceError> {
198 if self.state == AnnounceState::Idle {
199 self.state = AnnounceState::Pending;
200 Ok(())
201 } else {
202 Err(NamespaceError::InvalidTransition {
203 from: format!("{:?}", self.state),
204 event: "on_announce_sent".to_string(),
205 })
206 }
207 }
208
209 pub fn on_announce_ok(&mut self) -> Result<(), NamespaceError> {
211 if self.state == AnnounceState::Pending {
212 self.state = AnnounceState::Active;
213 Ok(())
214 } else {
215 Err(NamespaceError::InvalidTransition {
216 from: format!("{:?}", self.state),
217 event: "on_announce_ok".to_string(),
218 })
219 }
220 }
221
222 pub fn on_announce_error(&mut self) -> Result<(), NamespaceError> {
224 if self.state == AnnounceState::Pending {
225 self.state = AnnounceState::Done;
226 Ok(())
227 } else {
228 Err(NamespaceError::InvalidTransition {
229 from: format!("{:?}", self.state),
230 event: "on_announce_error".to_string(),
231 })
232 }
233 }
234
235 pub fn on_unannounce(&mut self) -> Result<(), NamespaceError> {
237 if self.state == AnnounceState::Active {
238 self.state = AnnounceState::Done;
239 Ok(())
240 } else {
241 Err(NamespaceError::InvalidTransition {
242 from: format!("{:?}", self.state),
243 event: "on_unannounce".to_string(),
244 })
245 }
246 }
247
248 pub fn on_announce_cancel(&mut self) -> Result<(), NamespaceError> {
250 if self.state == AnnounceState::Active {
251 self.state = AnnounceState::Done;
252 Ok(())
253 } else {
254 Err(NamespaceError::InvalidTransition {
255 from: format!("{:?}", self.state),
256 event: "on_announce_cancel".to_string(),
257 })
258 }
259 }
260}
261
262impl AnnounceStateMachine {
271 pub fn on_announce_received(&mut self) -> Result<(), NamespaceError> {
273 self.on_announce_sent().map_err(|_| NamespaceError::InvalidTransition {
274 from: format!("{:?}", self.state()),
275 event: "on_announce_received".to_string(),
276 })
277 }
278
279 pub fn on_announce_ok_sent(&mut self) -> Result<(), NamespaceError> {
281 self.on_announce_ok().map_err(|_| NamespaceError::InvalidTransition {
282 from: format!("{:?}", self.state()),
283 event: "on_announce_ok_sent".to_string(),
284 })
285 }
286
287 pub fn on_announce_error_sent(&mut self) -> Result<(), NamespaceError> {
289 self.on_announce_error().map_err(|_| NamespaceError::InvalidTransition {
290 from: format!("{:?}", self.state()),
291 event: "on_announce_error_sent".to_string(),
292 })
293 }
294
295 pub fn on_unannounce_received(&mut self) -> Result<(), NamespaceError> {
297 self.on_unannounce().map_err(|_| NamespaceError::InvalidTransition {
298 from: format!("{:?}", self.state()),
299 event: "on_unannounce_received".to_string(),
300 })
301 }
302
303 pub fn on_announce_cancel_sent(&mut self) -> Result<(), NamespaceError> {
309 self.on_announce_cancel().map_err(|_| NamespaceError::InvalidTransition {
310 from: format!("{:?}", self.state()),
311 event: "on_announce_cancel_sent".to_string(),
312 })
313 }
314}