67 lines
1.7 KiB
Rust
67 lines
1.7 KiB
Rust
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());
|
|
}
|
|
}
|