#[derive(Copy, Clone, PartialEq, Eq, Default, Debug, PartialOrd, Ord)] pub struct HwAddress { address: u64, } impl HwAddress { pub fn from_str(arg: &str) -> Option { let columnless_vec = arg.split(":").collect::>(); if columnless_vec.len() * 3 - 1 != arg.len() { return None; } for byte in &columnless_vec { if byte.len() != 2 { return None; } } u64::from_str_radix(columnless_vec.join("").as_str(), 16) .ok() .map(|address| HwAddress { address }) } pub fn from_string(arg: &String) -> Option { HwAddress::from_str(arg.as_str()) } } impl std::fmt::Display for HwAddress { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let hex = format!("{:#x}", self.address) .trim_start_matches("0x") .chars() .collect::>() .chunks(2) .map(|chunk| chunk.iter().cloned().collect::()) .collect::>() .join(":"); write!(f, "{}", hex) } }