#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ConnectionState {
Disconnected,
Connected,
ConnectionLost,
SessionExpired,
}
impl ConnectionState {
pub fn is_connected(self) -> bool {
matches!(self, Self::Connected)
}
pub fn is_terminal(self) -> bool {
matches!(self, Self::Disconnected | Self::SessionExpired)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn is_connected_only_true_for_connected() {
assert!(ConnectionState::Connected.is_connected());
assert!(!ConnectionState::Disconnected.is_connected());
assert!(!ConnectionState::ConnectionLost.is_connected());
assert!(!ConnectionState::SessionExpired.is_connected());
}
#[test]
fn is_terminal_covers_disconnected_and_expired() {
assert!(ConnectionState::Disconnected.is_terminal());
assert!(ConnectionState::SessionExpired.is_terminal());
assert!(!ConnectionState::Connected.is_terminal());
assert!(!ConnectionState::ConnectionLost.is_terminal());
}
#[test]
fn derives_equality_and_copy() {
let a = ConnectionState::Connected;
let b = a; assert_eq!(a, b);
assert_ne!(a, ConnectionState::Disconnected);
}
#[test]
fn debug_is_non_empty_for_every_variant() {
for v in [
ConnectionState::Disconnected,
ConnectionState::Connected,
ConnectionState::ConnectionLost,
ConnectionState::SessionExpired,
] {
assert!(!format!("{v:?}").is_empty());
}
}
}