use super::IPv6Address;
use super::boolean;
use super::description;
use super::ordering;
use crate::error::Error;
use crate::platform;
use crate::platform::ffi;
use std::cmp::Ordering;
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct MACAddress {
pub(crate) value: u64,
}
impl MACAddress {
pub fn new(value: u64) -> Result<Self, Error> {
platform::outcome(ffi::cz_mac_address_new(value), "make a MAC address").map(|outcome| outcome.mac_address())
}
pub fn from_bytes(bytes: &[u8]) -> Result<Self, Error> {
platform::outcome(
ffi::cz_mac_address_from_bytes(bytes.to_vec()),
format!("read {bytes:?} as a MAC address"),
)
.map(|outcome| outcome.mac_address())
}
pub fn parse(string: &str) -> Result<Self, Error> {
platform::outcome(
ffi::cz_mac_address_parse(string),
format!("parse {string:?} as a MAC address"),
)
.map(|outcome| outcome.mac_address())
}
pub fn value(&self) -> u64 {
self.value
}
pub fn bytes(&self) -> Result<Vec<u8>, Error> {
platform::outcome(ffi::cz_mac_address_bytes(self.value), "read a MAC address's bytes")
.map(|outcome| outcome.bytes())
}
pub fn description(&self) -> Result<String, Error> {
description(ffi::cz_mac_address_description(self.value), "describe a MAC address")
}
pub fn is_locally_administered(&self) -> Result<bool, Error> {
boolean(
ffi::cz_mac_address_is_locally_administered(self.value),
"check whether a MAC address is locally administered",
)
}
pub fn is_multicast(&self) -> Result<bool, Error> {
boolean(
ffi::cz_mac_address_is_multicast(self.value),
"check whether a MAC address is multicast",
)
}
pub fn ipv6_address(&self, network: &IPv6Address) -> Result<IPv6Address, Error> {
platform::outcome(
ffi::cz_mac_address_ipv6_address(self.value, network.clone()),
"make a MAC address's link-local IPv6 address",
)
.map(|outcome| outcome.ipv6_address())
}
}
impl PartialOrd for MACAddress {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
ordering(self, other, |lhs, rhs| {
boolean(
ffi::cz_mac_address_less_than(lhs.value, rhs.value),
"compare MAC addresses",
)
})
}
}