#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
pub struct NetConfig {
pub mac: [u8; 6],
}
impl Default for NetConfig {
fn default() -> Self {
NetConfig {
mac: [0x02, 0x00, 0x00, 0x00, 0x00, 0x01],
}
}
}
impl NetConfig {
pub fn mac(mut self, mac: [u8; 6]) -> Self {
self.mac = mac;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_has_locally_administered_bit() {
let cfg = NetConfig::default();
assert_eq!(
cfg.mac[0] & 0x02,
0x02,
"default MAC must have locally-administered bit (IEEE 802 first-octet bit 1)",
);
}
#[test]
fn default_is_unicast() {
let cfg = NetConfig::default();
assert_eq!(
cfg.mac[0] & 0x01,
0x00,
"default MAC must not be multicast (IEEE 802 first-octet bit 0)",
);
}
#[test]
fn mac_setter_overrides_default() {
let cfg = NetConfig::default().mac([0x52, 0x54, 0x00, 0xab, 0xcd, 0xef]);
assert_eq!(cfg.mac, [0x52, 0x54, 0x00, 0xab, 0xcd, 0xef]);
}
#[test]
fn serde_roundtrip_pins_field_names() {
let cfg = NetConfig::default().mac([1, 2, 3, 4, 5, 6]);
let json = serde_json::to_string(&cfg).expect("serialize");
assert!(json.contains("\"mac\""), "missing key `mac`: {json}");
let parsed: NetConfig = serde_json::from_str(&json).expect("deserialize");
assert_eq!(parsed, cfg);
}
}