moqtap_client/draft14/
track_status.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3pub enum TrackStatusState {
4 Idle,
6 Pending,
8 Done,
10}
11
12#[derive(Debug, thiserror::Error, PartialEq, Eq)]
14pub enum TrackStatusError {
15 #[error("invalid transition from {from:?} on event {event}")]
17 InvalidTransition {
18 from: TrackStatusState,
20 event: String,
22 },
23}
24
25pub struct TrackStatusStateMachine {
28 state: TrackStatusState,
29}
30
31impl Default for TrackStatusStateMachine {
32 fn default() -> Self {
33 Self::new()
34 }
35}
36
37impl TrackStatusStateMachine {
38 pub fn new() -> Self {
40 Self { state: TrackStatusState::Idle }
41 }
42
43 pub fn state(&self) -> TrackStatusState {
45 self.state
46 }
47
48 pub fn on_track_status_sent(&mut self) -> Result<(), TrackStatusError> {
50 if self.state == TrackStatusState::Idle {
51 self.state = TrackStatusState::Pending;
52 Ok(())
53 } else {
54 Err(TrackStatusError::InvalidTransition {
55 from: self.state,
56 event: "on_track_status_sent".to_string(),
57 })
58 }
59 }
60
61 pub fn on_track_status_ok(&mut self) -> Result<(), TrackStatusError> {
63 if self.state == TrackStatusState::Pending {
64 self.state = TrackStatusState::Done;
65 Ok(())
66 } else {
67 Err(TrackStatusError::InvalidTransition {
68 from: self.state,
69 event: "on_track_status_ok".to_string(),
70 })
71 }
72 }
73
74 pub fn on_track_status_error(&mut self) -> Result<(), TrackStatusError> {
76 if self.state == TrackStatusState::Pending {
77 self.state = TrackStatusState::Done;
78 Ok(())
79 } else {
80 Err(TrackStatusError::InvalidTransition {
81 from: self.state,
82 event: "on_track_status_error".to_string(),
83 })
84 }
85 }
86}