use serde::{Deserialize, Serialize};
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub enum MemberState {
Alive,
Suspect,
Dead,
Left,
}
impl MemberState {
pub const fn precedence(self) -> u8 {
match self {
MemberState::Alive => 0,
MemberState::Suspect => 1,
MemberState::Dead => 2,
MemberState::Left => 3,
}
}
pub const fn is_reachable(self) -> bool {
matches!(self, MemberState::Alive)
}
pub const fn is_terminal(self) -> bool {
matches!(self, MemberState::Left)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn precedence_is_total_and_strict() {
assert!(MemberState::Alive.precedence() < MemberState::Suspect.precedence());
assert!(MemberState::Suspect.precedence() < MemberState::Dead.precedence());
assert!(MemberState::Dead.precedence() < MemberState::Left.precedence());
}
#[test]
fn only_alive_is_reachable() {
assert!(MemberState::Alive.is_reachable());
assert!(!MemberState::Suspect.is_reachable());
assert!(!MemberState::Dead.is_reachable());
assert!(!MemberState::Left.is_reachable());
}
#[test]
fn only_left_is_terminal() {
assert!(!MemberState::Alive.is_terminal());
assert!(!MemberState::Suspect.is_terminal());
assert!(!MemberState::Dead.is_terminal());
assert!(MemberState::Left.is_terminal());
}
#[test]
fn exhaustive_match_reminder() {
fn _check(s: MemberState) {
match s {
MemberState::Alive
| MemberState::Suspect
| MemberState::Dead
| MemberState::Left => {}
}
}
}
}