From 87ea7b24faa631877bf89e26121d03d1c7d1ee85 Mon Sep 17 00:00:00 2001 From: Michal 'vorner' Vaner Date: Sat, 21 Dec 2019 16:16:22 +0100 Subject: [PATCH] Be able to parse the netmask format Allow accepting the netmask format, eg 192.168.1.0/255.255.255.0, in addition to the more modern /24 prefix version. Adding support for IPv4 only, as IPv6 never actually used that format in practice. Closes #107. --- src/ipv4.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/ipv4.rs b/src/ipv4.rs index f873d8e..eb81a5d 100644 --- a/src/ipv4.rs +++ b/src/ipv4.rs @@ -238,7 +238,13 @@ impl FromStr for Ipv4Network { let addr = Ipv4Addr::from_str(addr_str) .map_err(|_| IpNetworkError::InvalidAddr(addr_str.to_string()))?; let prefix = match prefix_str { - Some(v) => parse_prefix(v, IPV4_BITS)?, + Some(v) => { + if let Ok(netmask) = Ipv4Addr::from_str(v) { + ipv4_mask_to_prefix(netmask)? + } else { + parse_prefix(v, IPV4_BITS)? + } + }, None => IPV4_BITS, }; Ipv4Network::new(addr, prefix) @@ -469,6 +475,19 @@ mod test { assert_eq!(prefix, 25); } + /// Parse netmask as well as prefix + #[test] + fn parse_netmask() { + let from_netmask: Ipv4Network = "192.168.1.0/255.255.255.0".parse().unwrap(); + let from_prefix: Ipv4Network = "192.168.1.0/24".parse().unwrap(); + assert_eq!(from_netmask, from_prefix); + } + + #[test] + fn parse_netmask_broken() { + "192.168.1.0/255.0.255.0".parse::().unwrap_err(); + } + #[test] fn invalid_v4_mask_to_prefix() { let mask = Ipv4Addr::new(255, 0, 255, 0);