#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SubscribeNamespaceState {
Idle,
Pending,
Active,
Done,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PublishNamespaceState {
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 SubscribeNamespaceStateMachine {
state: SubscribeNamespaceState,
}
impl Default for SubscribeNamespaceStateMachine {
fn default() -> Self {
Self::new()
}
}
impl SubscribeNamespaceStateMachine {
pub fn new() -> Self {
Self { state: SubscribeNamespaceState::Idle }
}
pub fn state(&self) -> SubscribeNamespaceState {
self.state
}
pub fn on_subscribe_namespace_sent(&mut self) -> Result<(), NamespaceError> {
if self.state == SubscribeNamespaceState::Idle {
self.state = SubscribeNamespaceState::Pending;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_subscribe_namespace_sent".to_string(),
})
}
}
pub fn on_subscribe_namespace_ok(&mut self) -> Result<(), NamespaceError> {
if self.state == SubscribeNamespaceState::Pending {
self.state = SubscribeNamespaceState::Active;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_subscribe_namespace_ok".to_string(),
})
}
}
pub fn on_subscribe_namespace_error(&mut self) -> Result<(), NamespaceError> {
if self.state == SubscribeNamespaceState::Pending {
self.state = SubscribeNamespaceState::Done;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_subscribe_namespace_error".to_string(),
})
}
}
pub fn on_unsubscribe_namespace(&mut self) -> Result<(), NamespaceError> {
if self.state == SubscribeNamespaceState::Active {
self.state = SubscribeNamespaceState::Done;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_unsubscribe_namespace".to_string(),
})
}
}
}
pub struct PublishNamespaceStateMachine {
state: PublishNamespaceState,
}
impl Default for PublishNamespaceStateMachine {
fn default() -> Self {
Self::new()
}
}
impl PublishNamespaceStateMachine {
pub fn new() -> Self {
Self { state: PublishNamespaceState::Idle }
}
pub fn state(&self) -> PublishNamespaceState {
self.state
}
pub fn on_publish_namespace_sent(&mut self) -> Result<(), NamespaceError> {
if self.state == PublishNamespaceState::Idle {
self.state = PublishNamespaceState::Pending;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_publish_namespace_sent".to_string(),
})
}
}
pub fn on_publish_namespace_ok(&mut self) -> Result<(), NamespaceError> {
if self.state == PublishNamespaceState::Pending {
self.state = PublishNamespaceState::Active;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_publish_namespace_ok".to_string(),
})
}
}
pub fn on_publish_namespace_error(&mut self) -> Result<(), NamespaceError> {
if self.state == PublishNamespaceState::Pending {
self.state = PublishNamespaceState::Done;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_publish_namespace_error".to_string(),
})
}
}
pub fn on_publish_namespace_done(&mut self) -> Result<(), NamespaceError> {
if self.state == PublishNamespaceState::Active {
self.state = PublishNamespaceState::Done;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_publish_namespace_done".to_string(),
})
}
}
pub fn on_publish_namespace_cancel(&mut self) -> Result<(), NamespaceError> {
if self.state == PublishNamespaceState::Active {
self.state = PublishNamespaceState::Done;
Ok(())
} else {
Err(NamespaceError::InvalidTransition {
from: format!("{:?}", self.state),
event: "on_publish_namespace_cancel".to_string(),
})
}
}
}