#[derive(Default, Copy, Clone, Eq, PartialEq, Hash)]
#[repr(transparent)]
pub struct Guid {
raw: [u8; 8],
}
impl Guid {
pub fn oui(&self) -> u32 {
let padded = [0, self.raw[0], self.raw[1], self.raw[2]];
u32::from_be_bytes(padded)
}
pub fn is_reserved(&self) -> bool {
self.raw == [0; 8]
}
}
impl From<u64> for Guid {
fn from(guid: u64) -> Self {
Self {
raw: guid.to_be_bytes(),
}
}
}
impl From<Guid> for u64 {
fn from(guid: Guid) -> Self {
u64::from_be_bytes(guid.raw)
}
}
impl std::fmt::Debug for Guid {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}",
self.raw[0],
self.raw[1],
self.raw[2],
self.raw[3],
self.raw[4],
self.raw[5],
self.raw[6],
self.raw[7]
)
}
}