use crate::WireError;
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum AckLevel {
NoAck = 0,
#[default]
Quorum = 1,
}
impl AckLevel {
pub const fn from_code(code: u8) -> Result<Self, WireError> {
match code {
0 => Ok(Self::NoAck),
1 => Ok(Self::Quorum),
other => Err(WireError::UnknownDiscriminant {
type_name: "AckLevel",
value: other,
offset: 0,
}),
}
}
#[must_use]
pub const fn as_u8(self) -> u8 {
self as u8
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn roundtrip_no_ack() {
let level = AckLevel::NoAck;
let decoded = AckLevel::from_code(level.as_u8()).unwrap();
assert_eq!(decoded, level);
}
#[test]
fn roundtrip_quorum() {
let level = AckLevel::Quorum;
let decoded = AckLevel::from_code(level.as_u8()).unwrap();
assert_eq!(decoded, level);
}
#[test]
fn default_is_quorum() {
assert_eq!(AckLevel::default(), AckLevel::Quorum);
}
#[test]
fn discriminant_values() {
assert_eq!(AckLevel::NoAck.as_u8(), 0);
assert_eq!(AckLevel::Quorum.as_u8(), 1);
}
#[test]
fn unknown_discriminant_rejected() {
for code in 2u8..=u8::MAX {
let err = AckLevel::from_code(code).unwrap_err();
match err {
WireError::UnknownDiscriminant {
type_name,
value,
offset,
} => {
assert_eq!(type_name, "AckLevel");
assert_eq!(value, code);
assert_eq!(offset, 0);
}
other => panic!("unexpected error variant: {other:?}"),
}
}
}
}