#[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() .and_then(|address| Some(HwAddress { address })) } pub fn from_string(arg: &String) -> Option { HwAddress::from_str(arg.as_str()) } pub fn to_string(&self) -> String { format!("{:#x}", self.address) .trim_start_matches("0x") .chars() .collect::>() .chunks(2) .map(|chunk| chunk.iter().cloned().collect::()) .collect::>() .join(":") } }