moqtap_client/draft19/
namespace.rs1#[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> {
115 match self.state {
116 SubscribeNamespaceState::Pending | SubscribeNamespaceState::Active => {
117 self.state = SubscribeNamespaceState::Done;
118 Ok(())
119 }
120 SubscribeNamespaceState::Done => Ok(()),
121 SubscribeNamespaceState::Idle => Err(NamespaceError::InvalidTransition {
122 from: format!("{:?}", self.state),
123 event: "on_request_cancelled".to_string(),
124 }),
125 }
126 }
127}
128
129pub struct PublishNamespaceStateMachine {
132 state: PublishNamespaceState,
133}
134
135impl Default for PublishNamespaceStateMachine {
136 fn default() -> Self {
137 Self::new()
138 }
139}
140
141impl PublishNamespaceStateMachine {
142 pub fn new() -> Self {
144 Self { state: PublishNamespaceState::Idle }
145 }
146
147 pub fn state(&self) -> PublishNamespaceState {
149 self.state
150 }
151
152 pub fn on_publish_namespace_sent(&mut self) -> Result<(), NamespaceError> {
154 if self.state == PublishNamespaceState::Idle {
155 self.state = PublishNamespaceState::Pending;
156 Ok(())
157 } else {
158 Err(NamespaceError::InvalidTransition {
159 from: format!("{:?}", self.state),
160 event: "on_publish_namespace_sent".to_string(),
161 })
162 }
163 }
164
165 pub fn on_publish_namespace_ok(&mut self) -> Result<(), NamespaceError> {
167 if self.state == PublishNamespaceState::Pending {
168 self.state = PublishNamespaceState::Active;
169 Ok(())
170 } else {
171 Err(NamespaceError::InvalidTransition {
172 from: format!("{:?}", self.state),
173 event: "on_publish_namespace_ok".to_string(),
174 })
175 }
176 }
177
178 pub fn on_publish_namespace_error(&mut self) -> Result<(), NamespaceError> {
180 if self.state == PublishNamespaceState::Pending {
181 self.state = PublishNamespaceState::Done;
182 Ok(())
183 } else {
184 Err(NamespaceError::InvalidTransition {
185 from: format!("{:?}", self.state),
186 event: "on_publish_namespace_error".to_string(),
187 })
188 }
189 }
190
191 pub fn on_request_cancelled(&mut self) -> Result<(), NamespaceError> {
207 match self.state {
208 PublishNamespaceState::Pending | PublishNamespaceState::Active => {
209 self.state = PublishNamespaceState::Done;
210 Ok(())
211 }
212 PublishNamespaceState::Done => Ok(()),
213 PublishNamespaceState::Idle => Err(NamespaceError::InvalidTransition {
214 from: format!("{:?}", self.state),
215 event: "on_request_cancelled".to_string(),
216 }),
217 }
218 }
219}