#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TrackStatusState {
Idle,
Pending,
Done,
}
#[derive(Debug, thiserror::Error, PartialEq, Eq)]
pub enum TrackStatusError {
#[error("invalid transition from {from:?} on event {event}")]
InvalidTransition {
from: TrackStatusState,
event: String,
},
}
pub struct TrackStatusStateMachine {
state: TrackStatusState,
}
impl Default for TrackStatusStateMachine {
fn default() -> Self {
Self::new()
}
}
impl TrackStatusStateMachine {
pub fn new() -> Self {
Self { state: TrackStatusState::Idle }
}
pub fn state(&self) -> TrackStatusState {
self.state
}
pub fn on_track_status_sent(&mut self) -> Result<(), TrackStatusError> {
if self.state == TrackStatusState::Idle {
self.state = TrackStatusState::Pending;
Ok(())
} else {
Err(TrackStatusError::InvalidTransition {
from: self.state,
event: "on_track_status_sent".to_string(),
})
}
}
pub fn on_track_status_ok(&mut self) -> Result<(), TrackStatusError> {
if self.state == TrackStatusState::Pending {
self.state = TrackStatusState::Done;
Ok(())
} else {
Err(TrackStatusError::InvalidTransition {
from: self.state,
event: "on_track_status_ok".to_string(),
})
}
}
pub fn on_track_status_error(&mut self) -> Result<(), TrackStatusError> {
if self.state == TrackStatusState::Pending {
self.state = TrackStatusState::Done;
Ok(())
} else {
Err(TrackStatusError::InvalidTransition {
from: self.state,
event: "on_track_status_error".to_string(),
})
}
}
}