1#[derive(Debug, Clone, Copy, PartialEq)]
4#[cfg_attr(feature = "defmt", derive(defmt::Format))]
5pub enum Address {
6 Broadcast,
7 Unicast(u8),
8}
9impl Address {
10 pub(crate) fn from_u8(addr: u8) -> Address {
11 if addr == 255 {
12 Self::Broadcast
13 } else {
14 Self::Unicast(addr)
15 }
16 }
17
18 pub(crate) fn as_u8(&self) -> u8 {
19 match self {
20 Self::Broadcast => 255,
21 Self::Unicast(addr) => *addr,
22 }
23 }
24}
25
26#[cfg(test)]
27mod tests {
28 use super::*;
29
30 #[test]
31 fn from_u8_recognizes_broadcast() {
32 assert_eq!(Address::from_u8(255), Address::Broadcast);
33 }
34
35 #[test]
36 fn from_u8_recognizes_unicast() {
37 assert_eq!(Address::from_u8(0), Address::Unicast(0));
38 assert_eq!(Address::from_u8(42), Address::Unicast(42));
39 assert_eq!(Address::from_u8(254), Address::Unicast(254));
41 }
42
43 #[test]
44 fn as_u8_encodes_broadcast() {
45 assert_eq!(Address::Broadcast.as_u8(), 255);
46 }
47
48 #[test]
49 fn as_u8_encodes_unicast() {
50 assert_eq!(Address::Unicast(0).as_u8(), 0);
51 assert_eq!(Address::Unicast(42).as_u8(), 42);
52 assert_eq!(Address::Unicast(254).as_u8(), 254);
53 }
54
55 #[test]
56 fn roundtrip_preserves_address() {
57 for byte in 0u8..=255 {
58 assert_eq!(Address::from_u8(byte).as_u8(), byte);
59 }
60 }
61}