diff --git a/src/ipv4.rs b/src/ipv4.rs index 32cfd66..b738ac4 100644 --- a/src/ipv4.rs +++ b/src/ipv4.rs @@ -195,6 +195,16 @@ impl FromStr for Ipv4Network { } } + +impl From for Ipv4Network { + fn from(a: Ipv4Addr) -> Ipv4Network { + Ipv4Network { + addr: a, + prefix: 32, + } + } +} + pub struct Ipv4NetworkIterator { next: u64, end: u64, @@ -432,4 +442,11 @@ mod test { let prefix = ipv4_mask_to_prefix(mask); assert!(prefix.is_err()); } + + #[test] + fn ipv4network_from_ipv4addr() { + let net = Ipv4Network::from(Ipv4Addr::new(127, 0, 0, 1)); + let expected = Ipv4Network::new(Ipv4Addr::new(127, 0, 0, 1), 32).unwrap(); + assert_eq!(net, expected); + } } diff --git a/src/ipv6.rs b/src/ipv6.rs index f1a7d61..640a28f 100644 --- a/src/ipv6.rs +++ b/src/ipv6.rs @@ -172,6 +172,15 @@ impl FromStr for Ipv6Network { } } +impl From for Ipv6Network { + fn from(a: Ipv6Addr) -> Ipv6Network { + Ipv6Network { + addr: a, + prefix: 128, + } + } +} + #[cfg(feature = "ipv6-iterator")] pub struct Ipv6NetworkIterator { next: u128, @@ -373,4 +382,11 @@ mod test { let cidr: Ipv6Network = "2001:db8::0/96".parse().unwrap(); assert_eq!(cidr.size(), 4294967296); } + + #[test] + fn ipv6network_from_ipv6addr() { + let net = Ipv6Network::from(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)); + let expected = Ipv6Network::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 128).unwrap(); + assert_eq!(net, expected); + } } diff --git a/src/lib.rs b/src/lib.rs index 2d3e54b..558625d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -163,6 +163,15 @@ impl From for IpNetwork { } } +impl From for IpNetwork { + fn from(addr: IpAddr) -> IpNetwork { + match addr { + IpAddr::V4(a) => IpNetwork::V4(Ipv4Network::from(a)), + IpAddr::V6(a) => IpNetwork::V6(Ipv6Network::from(a)), + } + } +} + impl fmt::Display for IpNetwork { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self {