#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub enum BandwidthClass {
#[default]
Foreground,
Background,
Realtime,
}
impl BandwidthClass {
pub const FOREGROUND_WIRE: u8 = 0;
pub const BACKGROUND_WIRE: u8 = 1;
pub const REALTIME_WIRE: u8 = 2;
pub fn as_u8(self) -> u8 {
match self {
Self::Foreground => Self::FOREGROUND_WIRE,
Self::Background => Self::BACKGROUND_WIRE,
Self::Realtime => Self::REALTIME_WIRE,
}
}
pub fn from_wire_or_default(byte: u8) -> Self {
match byte {
Self::BACKGROUND_WIRE => Self::Background,
Self::REALTIME_WIRE => Self::Realtime,
_ => Self::Foreground,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_foreground() {
assert_eq!(BandwidthClass::default(), BandwidthClass::Foreground);
}
#[test]
fn wire_round_trip_for_every_variant() {
for c in [
BandwidthClass::Foreground,
BandwidthClass::Background,
BandwidthClass::Realtime,
] {
assert_eq!(BandwidthClass::from_wire_or_default(c.as_u8()), c);
}
}
#[test]
fn unknown_wire_discriminant_decodes_as_foreground() {
assert_eq!(
BandwidthClass::from_wire_or_default(7),
BandwidthClass::Foreground
);
assert_eq!(
BandwidthClass::from_wire_or_default(255),
BandwidthClass::Foreground
);
}
}