use std::io::BufRead;
use std::iter::repeat;
pub const ETHER_ADDR_LEN: usize = 6;
pub type EtherAddr = [u8; ETHER_ADDR_LEN];
pub fn parse<R: BufRead>(r: R) -> impl Iterator<Item = ((EtherAddr, u32), (String, String))> {
r.lines().flatten().flat_map(|line| {
let line = line.trim();
if line.is_empty() || line.starts_with('#') {
None
} else {
let (prefix_str, name, desc) = {
let mut v = line.splitn(3, '\t').chain(repeat(""));
(v.next()?, v.next()?, v.next()?)
};
let (prefix_str, prefix_len) = {
let mut v = prefix_str.split('/');
(
v.next()?,
v.next()
.and_then(|s| s.parse().ok())
.unwrap_or_else(|| 8 * prefix_str.split(':').count()),
)
};
let prefix = {
let mut v = prefix_str
.split(':')
.flat_map(|s| u8::from_str_radix(s, 16))
.chain(repeat(0));
[
v.next()?,
v.next()?,
v.next()?,
v.next()?,
v.next()?,
v.next()?,
]
};
Some((
(prefix, prefix_len as u32),
(name.to_owned(), desc.to_owned()),
))
}
})
}