netaddr2 0.10.0

A Rust network address parsing and arithmetic library
Documentation
use super::NetAddr;
use crate::traits::Contains;

impl Contains<std::net::IpAddr> for NetAddr {
	fn contains(&self, other: &std::net::IpAddr) -> bool {
		match self {
			Self::V4(netaddr) => netaddr.contains(other),
			Self::V6(netaddr) => netaddr.contains(other),
		}
	}
}

impl Contains<std::net::Ipv4Addr> for NetAddr {
	fn contains(&self, other: &std::net::Ipv4Addr) -> bool {
		match self {
			Self::V4(netaddr) => netaddr.contains(other),
			_ => false,
		}
	}
}

impl Contains<std::net::Ipv6Addr> for NetAddr {
	fn contains(&self, other: &std::net::Ipv6Addr) -> bool {
		match self {
			Self::V6(netaddr) => netaddr.contains(other),
			_ => false,
		}
	}
}

impl Contains<NetAddr> for NetAddr {
	fn contains(&self, other: &NetAddr) -> bool {
		match self {
			Self::V4(netaddr) => netaddr.contains(other),
			Self::V6(netaddr) => netaddr.contains(other),
		}
	}
}

impl Contains<crate::Netv4Addr> for NetAddr {
	fn contains(&self, other: &crate::Netv4Addr) -> bool {
		match self {
			Self::V4(netaddr) => netaddr.contains(other),
			_ => false,
		}
	}
}

impl Contains<crate::Netv6Addr> for NetAddr {
	fn contains(&self, other: &crate::Netv6Addr) -> bool {
		match self {
			Self::V6(netaddr) => netaddr.contains(other),
			_ => false,
		}
	}
}

#[cfg(test)]
mod tests {
	use super::*;
	use crate::NetAddr;
	use std::net::IpAddr;

	macro_rules! assert_contains {
		($a:expr, $b:expr) => {
			assert!($a.contains(&$b));
		};
		($a:expr, $b:literal # $b_ty:ty) => {
			assert!($a.contains(&pu!($b # $b_ty)));
		};
		($a:literal # $a_ty:ty, $b:expr) => {
			assert!(pu!($a # $a_ty).contains(&$b));
		};
		($a:literal # $a_ty:ty, $b:literal # $b_ty:ty) => {
			assert!(pu!($a # $a_ty).contains(&pu!($b # $b_ty)));
		};
	}

	macro_rules! assert_not_contains {
		($a:expr, $b:expr) => {
			assert!(!$a.contains(&$b));
		};
		($a:expr, $b:literal # $b_ty:ty) => {
			assert!(!$a.contains(&pu!($b # $b_ty)));
		};
		($a:literal # $a_ty:ty, $b:expr) => {
			assert!(!pu!($a # $a_ty).contains(&$b));
		};
		($a:literal # $a_ty:ty, $b:literal # $b_ty:ty) => {
			assert!(!pu!($a # $a_ty).contains(&pu!($b # $b_ty)));
		};
	}

	mod v4 {
		use super::*;
		use crate::{Netv4Addr, Netv6Addr};
		use std::net::{Ipv4Addr, Ipv6Addr};

		#[test]
		fn ipaddr_v4() {
			let net = pu!("127.0.0.1/8" # NetAddr);
			assert_contains!(net, "127.0.0.1" # IpAddr);
			assert_contains!(net, "127.127.255.1" # IpAddr);
			assert_not_contains!(net, "64.73.69.2" # IpAddr);
		}

		#[test]
		fn ipaddr_v6() {
			let net = pu!("127.0.0.1/8" # NetAddr);
			assert_not_contains!(net, "ff02::1" # IpAddr);
			assert_not_contains!(net, "::ffff:127.0.0.1" # IpAddr);
		}

		#[test]
		fn ipv4addr() {
			let net = pu!("127.0.0.1/8" # NetAddr);
			assert_contains!(net, "127.0.0.1" # Ipv4Addr);
			assert_contains!(net, "127.127.255.1" # Ipv4Addr);
			assert_not_contains!(net, "64.73.69.2" # Ipv4Addr);
		}

		#[test]
		fn ipv6addr() {
			let net = pu!("127.0.0.1/8" # NetAddr);
			assert_not_contains!(net, "ff02::1" # Ipv6Addr);
			assert_not_contains!(net, "::ffff:127.0.0.1" # Ipv6Addr);
		}

		#[test]
		fn netaddr_v4() {
			let net = pu!("127.0.0.1/8" # NetAddr);
			assert_contains!(net, "127.128.0.1/24" # NetAddr);
		}

		#[test]
		fn netaddr_v6() {
			let net = pu!("127.0.0.1/8" # NetAddr);
			assert_not_contains!(net, "ff02::1/16" # NetAddr);
			assert_not_contains!(net, "::ffff:127.0.0.1/96" # NetAddr);
		}

		#[test]
		fn netv4addr() {
			let net: NetAddr = "127.0.0.1/8".parse().unwrap();
			assert_contains!(net, "127.0.0.1/24" # Netv4Addr);
			assert_contains!(net, "127.127.255.63/24" # Netv4Addr);
			assert_not_contains!(net, "64.73.81.69/24" # Netv4Addr);
		}

		#[test]
		fn netv6addr() {
			let net: NetAddr = "127.0.0.1/8".parse().unwrap();
			assert_not_contains!(net, "ff02::1/16" # Netv6Addr);
			assert_not_contains!(net, "::ffff:127.0.0.1/96" # Netv6Addr);
		}
	}

	mod v6 {
		use super::*;
		use crate::{Netv4Addr, Netv6Addr};
		use std::net::{Ipv4Addr, Ipv6Addr};

		#[test]
		fn ipaddr_v4() {
			let net = pu!("2001:db8:dead:beef::/64" # NetAddr);
			assert_not_contains!(net, "127.0.0.1" # IpAddr);
			assert_not_contains!(net, "127.127.255.1" # IpAddr);
			assert_not_contains!(net, "64.73.69.2" # IpAddr);
		}

		#[test]
		fn ipaddr_v6() {
			let net = pu!("2001:db8:dead:beef::/64" # NetAddr);
			assert_not_contains!(net, "ff02::1" # IpAddr);
			assert_not_contains!(net, "::ffff:127.0.0.1" # IpAddr);
			assert_contains!(net, "2001:db8:dead:beef::1" # IpAddr);
			assert_contains!(net, "2001:db8:dead:beef:c0f:fee:dab:69" # IpAddr);
		}

		#[test]
		fn ipv4addr() {
			let net = pu!("2001:db8:dead:beef::/64" # NetAddr);
			assert_not_contains!(net, "127.0.0.1" # Ipv4Addr);
			assert_not_contains!(net, "127.127.255.1" # Ipv4Addr);
			assert_not_contains!(net, "64.73.69.2" # Ipv4Addr);
		}

		#[test]
		fn ipv6addr() {
			let net = pu!("2001:db8:dead:beef::/64" # NetAddr);
			assert_not_contains!(net, "ff02::1" # Ipv6Addr);
			assert_not_contains!(net, "::ffff:127.0.0.1" # Ipv6Addr);
			assert_contains!(net, "2001:db8:dead:beef::1" # Ipv6Addr);
			assert_contains!(net, "2001:db8:dead:beef:c0f:fee:dab:69" # Ipv6Addr);
		}

		#[test]
		fn netaddr_v4() {
			let net = pu!("2001:db8:dead:beef::/64" # NetAddr);
			assert_not_contains!(net, "127.128.0.1/24" # NetAddr);
			assert_contains!(net, "2001:db8:dead:beef::1/64" # NetAddr);
			assert_contains!(net, "2001:db8:dead:beef:c0f:fee::/96" # NetAddr);
		}

		#[test]
		fn netaddr_v6() {
			let net = pu!("2001:db8:dead:beef::/64" # NetAddr);
			assert_not_contains!(net, "ff02::1/16" # NetAddr);
			assert_not_contains!(net, "::ffff:127.0.0.1/96" # NetAddr);
		}

		#[test]
		fn netv4addr() {
			let net: NetAddr = "2001:db8:dead:beef::/64".parse().unwrap();
			assert_not_contains!(net, "127.0.0.1/24" # Netv4Addr);
			assert_not_contains!(net, "127.127.255.63/24" # Netv4Addr);
			assert_not_contains!(net, "64.73.81.69/24" # Netv4Addr);
		}

		#[test]
		fn netv6addr() {
			let net: NetAddr = "2001:db8:dead:beef::/64".parse().unwrap();
			assert_not_contains!(net, "ff02::1/16" # Netv6Addr);
			assert_not_contains!(net, "::ffff:127.0.0.1/96" # Netv6Addr);
			assert_contains!(net, "2001:db8:dead:beef::1/64" # Netv6Addr);
			assert_contains!(net, "2001:db8:dead:beef:c0f:fee::/96" # Netv6Addr);
		}
	}
}