use thiserror::Error; pub fn parse_mac_address(mac: &str) -> Result<[u8; 6], MacAddressError> { if mac.len() != 12 { return Err(MacAddressError::Length(mac.len())); } let mut mac_bytes = [0u8; 6]; for i in 0..6 { let hex_part = &mac[i * 2..i * 2 + 2]; mac_bytes[i] = u8::from_str_radix(hex_part, 16)?; } Ok(mac_bytes) } #[derive(Error, Debug)] pub enum MacAddressError { #[error("Error converting MAC Address")] Conversion(#[from] std::num::ParseIntError), #[error("MAC Address length mismatch")] Length(usize), } #[cfg(test)] mod tests { use super::*; #[test] fn test_valid_mac_address_plain() { let mac_str = "001A2B3C4D5E"; let expected = [0x00, 0x1A, 0x2B, 0x3C, 0x4D, 0x5E]; assert_eq!(parse_mac_address(mac_str).unwrap(), expected); } #[test] fn test_valid_lowercase_mac_address() { let mac_str = "001a2b3c4d5e"; let expected = [0x00, 0x1A, 0x2B, 0x3C, 0x4D, 0x5E]; assert_eq!(parse_mac_address(mac_str).unwrap(), expected); } #[test] fn test_invalid_mac_address_wrong_length() { let mac_str = "001A2B3C4D"; assert!(parse_mac_address(mac_str).is_err()); } #[test] fn test_invalid_mac_address_invalid_characters() { let mac_str = "001A2B3C4DZZ"; assert!(parse_mac_address(mac_str).is_err()); } #[test] fn test_empty_mac_address() { let mac_str = ""; assert!(parse_mac_address(mac_str).is_err()); } #[test] fn test_mac_address_with_extra_spaces() { let mac_str = "001A2B3C 4D5E"; assert!(parse_mac_address(mac_str).is_err()); } }