#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SubscribeAnnouncesState {
Idle,
Pending,
Active,
Done,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AnnounceState {
Idle,
Pending,
Active,
Done,
}
#[derive(Debug, thiserror::Error, PartialEq, Eq)]
pub enum NamespaceError {
#[error("invalid transition from {from} on event {event}")]
InvalidTransition {
from: String,
event: String,
},
}
pub struct SubscribeAnnouncesStateMachine {
state: SubscribeAnnouncesState,
}
impl Default for SubscribeAnnouncesStateMachine {
fn default() -> Self {
Self::new()
}
}
impl SubscribeAnnouncesStateMachine {
pub fn new() -> Self {
Self { state: SubscribeAnnouncesState::Idle }
}
pub fn state(&self) -> SubscribeAnnouncesState {
self.state
}
pub fn on_subscribe_announces_sent(&mut self) -> Result<(), NamespaceError> {
if self.state == SubscribeAnnouncesState::Idle {
self.state = SubscribeAnnouncesState::Pending;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_subscribe_announces_sent".to_string(),
})
}
}
pub fn on_subscribe_announces_ok(&mut self) -> Result<(), NamespaceError> {
if self.state == SubscribeAnnouncesState::Pending {
self.state = SubscribeAnnouncesState::Active;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_subscribe_announces_ok".to_string(),
})
}
}
pub fn on_subscribe_announces_error(&mut self) -> Result<(), NamespaceError> {
if self.state == SubscribeAnnouncesState::Pending {
self.state = SubscribeAnnouncesState::Done;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_subscribe_announces_error".to_string(),
})
}
}
pub fn on_unsubscribe_announces(&mut self) -> Result<(), NamespaceError> {
if self.state == SubscribeAnnouncesState::Active {
self.state = SubscribeAnnouncesState::Done;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_unsubscribe_announces".to_string(),
})
}
}
}
pub struct AnnounceStateMachine {
state: AnnounceState,
}
impl Default for AnnounceStateMachine {
fn default() -> Self {
Self::new()
}
}
impl AnnounceStateMachine {
pub fn new() -> Self {
Self { state: AnnounceState::Idle }
}
pub fn state(&self) -> AnnounceState {
self.state
}
pub fn on_announce_sent(&mut self) -> Result<(), NamespaceError> {
if self.state == AnnounceState::Idle {
self.state = AnnounceState::Pending;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_announce_sent".to_string(),
})
}
}
pub fn on_announce_ok(&mut self) -> Result<(), NamespaceError> {
if self.state == AnnounceState::Pending {
self.state = AnnounceState::Active;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_announce_ok".to_string(),
})
}
}
pub fn on_announce_error(&mut self) -> Result<(), NamespaceError> {
if self.state == AnnounceState::Pending {
self.state = AnnounceState::Done;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_announce_error".to_string(),
})
}
}
pub fn on_unannounce(&mut self) -> Result<(), NamespaceError> {
if self.state == AnnounceState::Active {
self.state = AnnounceState::Done;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_unannounce".to_string(),
})
}
}
pub fn on_announce_cancel(&mut self) -> Result<(), NamespaceError> {
if self.state == AnnounceState::Active {
self.state = AnnounceState::Done;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_announce_cancel".to_string(),
})
}
}
}