use crate::{multiaddr::Multiaddr, multiaddr_to_socketaddr};
use std::net::IpAddr;
#[derive(Hash, Eq, PartialEq, Debug)]
pub enum Group {
None,
LocalNetwork,
IP4([u8; 2]),
IP6([u8; 4]),
}
impl From<&Multiaddr> for Group {
fn from(multiaddr: &Multiaddr) -> Group {
if let Some(socket_addr) = multiaddr_to_socketaddr(multiaddr) {
let ip_addr = socket_addr.ip();
if ip_addr.is_loopback() {
return Group::LocalNetwork;
}
if let IpAddr::V4(ipv4) = ip_addr {
let bits = ipv4.octets();
return Group::IP4([bits[0], bits[1]]);
}
if let IpAddr::V6(ipv6) = ip_addr {
if let Some(ipv4) = ipv6.to_ipv4() {
let bits = ipv4.octets();
return Group::IP4([bits[0], bits[1]]);
}
let bits = ipv6.octets();
return Group::IP6([bits[0], bits[1], bits[2], bits[3]]);
}
}
Group::None
}
}