mac_address2/iter/
linux.rs

1use crate::{MacAddress, MacAddressError};
2use nix::ifaddrs;
3
4/// An iterator over all available MAC addresses on the system.
5pub struct MacAddressIterator {
6    iter: std::iter::FilterMap<
7        ifaddrs::InterfaceAddressIterator,
8        fn(ifaddrs::InterfaceAddress) -> Option<MacAddress>,
9    >,
10}
11
12impl MacAddressIterator {
13    /// Creates a new `MacAddressIterator`.
14    pub fn new() -> Result<MacAddressIterator, MacAddressError> {
15        Ok(Self {
16            iter: ifaddrs::getifaddrs()?.filter_map(filter_macs),
17        })
18    }
19}
20
21fn filter_macs(intf: ifaddrs::InterfaceAddress) -> Option<MacAddress> {
22    let address = intf.address?;
23    let link = address.as_link_addr()?;
24    Some(MacAddress::new(link.addr()?))
25}
26
27impl Iterator for MacAddressIterator {
28    type Item = MacAddress;
29
30    fn next(&mut self) -> Option<MacAddress> {
31        self.iter.next()
32    }
33}