Files
iot-cloud-api/src/util.rs

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());
}
}