use bnb::{BitEnum, Bits, bitfield, u2, u4};
#[derive(BitEnum, Clone, Copy, Debug, PartialEq, Eq)]
#[bit_enum(u2)]
enum Ecn {
NotEct,
Ect1,
Ect0,
Ce,
}
#[derive(BitEnum, Clone, Copy, Debug, PartialEq, Eq)]
#[bit_enum(u16, bytes = be)]
#[repr(u16)]
enum HardwareType {
Ethernet = 1,
Ieee802 = 6,
FrameRelay = 15,
InfiniBand = 32,
#[catch_all]
Other(u16),
}
#[derive(BitEnum, Clone, Copy, Debug, PartialEq, Eq)]
#[bit_enum(u8, closed)]
#[repr(u8)]
enum Direction {
Request = 1,
Reply = 2,
}
#[derive(BitEnum, Clone, Copy, Debug, PartialEq, Eq)]
#[bit_enum(u4)]
enum Op {
Read,
Write,
#[catch_all]
Vendor(u4),
}
#[bitfield(u8, bits = msb)]
#[derive(Clone, Copy, Debug)]
struct Command {
op: Op,
flags: u4,
}
fn main() {
for raw in 0u128..4 {
println!("ecn {raw} -> {:?}", Ecn::from_bits(raw));
}
println!("hw 1 -> {:?}", HardwareType::from_bits(1)); println!("hw 99 -> {:?}", HardwareType::from_bits(99)); assert_eq!(HardwareType::from_bits(99), HardwareType::Other(99));
assert_eq!(HardwareType::Other(99).into_bits(), 99);
assert_eq!(u16::from(HardwareType::Ethernet), 1);
assert_eq!(HardwareType::from(99u16), HardwareType::Other(99));
assert_eq!(u16::from(HardwareType::from(0x1234u16)), 0x1234);
assert_eq!(Direction::try_from(2u8), Ok(Direction::Reply));
match Direction::try_from(7u8) {
Ok(d) => println!("direction: {d:?}"),
Err(e) => println!("rejected: {e}"), }
assert!(Direction::try_from(7u8).is_err());
let cmd = Command::new()
.with_op(Op::Vendor(u4::new(0xC)))
.with_flags(u4::new(0x5));
println!(
"command byte: {:#04x} (op={:?}, flags={})",
cmd.raw(),
cmd.op(),
cmd.flags()
);
assert_eq!(cmd.op(), Op::Vendor(u4::new(0xC)));
match u2::try_new(5) {
Ok(v) => println!("ok: {v}"),
Err(e) => println!("rejected: {e}"), }
assert!(u2::try_new(3).is_ok());
assert!(u2::try_new(4).is_err());
}