use std::collections::HashMap;
use crate::server::connection::ConnectionId;
#[derive(Debug)]
pub struct StateMachine<S: Clone> {
states: HashMap<ConnectionId, S>,
default_state: S,
}
impl<S: Clone> StateMachine<S> {
pub fn new(default_state: S) -> Self {
Self {
states: HashMap::new(),
default_state,
}
}
pub fn get_state(&self, connection_id: ConnectionId) -> S {
self.states
.get(&connection_id)
.cloned()
.unwrap_or_else(|| self.default_state.clone())
}
pub fn set_state(&mut self, connection_id: ConnectionId, state: S) {
self.states.insert(connection_id, state);
}
pub fn remove_state(&mut self, connection_id: ConnectionId) {
self.states.remove(&connection_id);
}
pub fn reset_state(&mut self, connection_id: ConnectionId) {
self.states
.insert(connection_id, self.default_state.clone());
}
pub fn len(&self) -> usize {
self.states.len()
}
pub fn is_empty(&self) -> bool {
self.states.is_empty()
}
}