use std::net::IpAddr;
pub(crate) fn unmap_ipv4(ip: IpAddr) -> IpAddr {
match ip {
IpAddr::V6(v6) => v6.to_ipv4_mapped().map_or(ip, IpAddr::V4),
IpAddr::V4(_) => ip,
}
}
#[cfg(test)]
mod tests {
use super::unmap_ipv4;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
#[test]
fn unmaps_ipv4_mapped_addresses() {
assert_eq!(
unmap_ipv4("::ffff:203.0.113.9".parse().unwrap()),
IpAddr::V4(Ipv4Addr::new(203, 0, 113, 9))
);
}
#[test]
fn leaves_native_addresses_alone() {
let v4 = IpAddr::V4(Ipv4Addr::new(203, 0, 113, 9));
assert_eq!(unmap_ipv4(v4), v4);
let v6 = IpAddr::V6("2001:db8::1".parse::<Ipv6Addr>().unwrap());
assert_eq!(unmap_ipv4(v6), v6);
let loopback = IpAddr::V6(Ipv6Addr::LOCALHOST);
assert_eq!(unmap_ipv4(loopback), loopback);
}
}