mac_address2/iter/
linux.rs1use crate::{MacAddress, MacAddressError};
2use nix::ifaddrs;
3
4pub struct MacAddressIterator {
6 iter: std::iter::FilterMap<
7 ifaddrs::InterfaceAddressIterator,
8 fn(ifaddrs::InterfaceAddress) -> Option<MacAddress>,
9 >,
10}
11
12impl MacAddressIterator {
13 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}