Skip to main content

rfm69_async/
address.rs

1// SPDX-License-Identifier: AGPL-3.0-only
2
3#[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        // 254 is the highest unicast address; 255 is reserved for broadcast.
40        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}