use zerodds_cdr::Endianness;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct Flags(pub u8);
impl Flags {
pub const BYTE_ORDER_BIT: u8 = 0b0000_0001;
pub const FRAGMENT_BIT: u8 = 0b0000_0010;
#[must_use]
pub const fn from_endianness(e: Endianness) -> Self {
match e {
Endianness::Big => Self(0),
Endianness::Little => Self(Self::BYTE_ORDER_BIT),
}
}
#[must_use]
pub const fn endianness(self) -> Endianness {
if self.0 & Self::BYTE_ORDER_BIT != 0 {
Endianness::Little
} else {
Endianness::Big
}
}
#[must_use]
pub const fn has_more_fragments(self) -> bool {
self.0 & Self::FRAGMENT_BIT != 0
}
#[must_use]
pub const fn with_fragment(mut self, more: bool) -> Self {
if more {
self.0 |= Self::FRAGMENT_BIT;
} else {
self.0 &= !Self::FRAGMENT_BIT;
}
self
}
}
#[cfg(test)]
#[allow(clippy::expect_used, clippy::unwrap_used, clippy::panic)]
mod tests {
use super::*;
#[test]
fn from_endianness_round_trip() {
assert_eq!(Flags::from_endianness(Endianness::Big).0, 0);
assert_eq!(
Flags::from_endianness(Endianness::Little).0,
Flags::BYTE_ORDER_BIT
);
assert_eq!(
Flags::from_endianness(Endianness::Little).endianness(),
Endianness::Little
);
}
#[test]
fn fragment_bit_default_off() {
assert!(!Flags::default().has_more_fragments());
}
#[test]
fn with_fragment_sets_and_clears_bit() {
let f = Flags::default().with_fragment(true);
assert!(f.has_more_fragments());
let g = f.with_fragment(false);
assert!(!g.has_more_fragments());
}
#[test]
fn fragment_bit_value_matches_spec() {
assert_eq!(Flags::FRAGMENT_BIT, 0x02);
}
#[test]
fn byte_order_bit_value_matches_spec() {
assert_eq!(Flags::BYTE_ORDER_BIT, 0x01);
}
#[test]
fn fragment_and_byte_order_can_combine() {
let f = Flags(Flags::BYTE_ORDER_BIT | Flags::FRAGMENT_BIT);
assert_eq!(f.endianness(), Endianness::Little);
assert!(f.has_more_fragments());
}
}