use std::time::Duration;
use super::{ConnectionState, ReconnectConfig};
pub struct ConnectionMonitor {
heartbeat_interval: Duration,
reconnect_config: Option<ReconnectConfig>,
state: ConnectionState,
}
impl ConnectionMonitor {
#[must_use]
pub fn new(heartbeat_interval: Duration) -> Self {
Self {
heartbeat_interval,
reconnect_config: None,
state: ConnectionState::Connected,
}
}
#[must_use]
pub fn with_reconnect(heartbeat_interval: Duration, reconnect_config: ReconnectConfig) -> Self {
Self {
heartbeat_interval,
reconnect_config: Some(reconnect_config),
state: ConnectionState::Connected,
}
}
#[must_use]
pub fn state(&self) -> ConnectionState {
self.state
}
#[must_use]
pub fn heartbeat_interval(&self) -> Duration {
self.heartbeat_interval
}
#[must_use]
pub fn auto_reconnect_enabled(&self) -> bool {
self.reconnect_config.is_some()
}
#[must_use]
pub fn reconnect_config(&self) -> Option<&ReconnectConfig> {
self.reconnect_config.as_ref()
}
pub fn set_state(&mut self, state: ConnectionState) {
self.state = state;
}
}
impl Default for ConnectionMonitor {
fn default() -> Self {
Self::new(Duration::from_secs(1))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_monitor() {
let monitor = ConnectionMonitor::new(Duration::from_secs(1));
assert_eq!(monitor.state(), ConnectionState::Connected);
assert!(!monitor.auto_reconnect_enabled());
}
#[test]
fn test_with_reconnect() {
let monitor =
ConnectionMonitor::with_reconnect(Duration::from_secs(1), ReconnectConfig::default());
assert!(monitor.auto_reconnect_enabled());
}
#[test]
fn test_set_state() {
let mut monitor = ConnectionMonitor::new(Duration::from_secs(1));
monitor.set_state(ConnectionState::Disconnected);
assert_eq!(monitor.state(), ConnectionState::Disconnected);
}
}