mirror of
https://github.com/achanda/ipnetwork.git
synced 2025-06-17 09:18:51 +00:00
Implement FromStr for IPv6
This commit is contained in:
40
src/ipv6.rs
40
src/ipv6.rs
@ -28,12 +28,9 @@ impl Ipv6Network {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_cidr(cidr: &str) -> Result<Ipv6Network, IpNetworkError> {
|
#[deprecated(since="0.9.1", note="please use `String::parse()` instead")]
|
||||||
let (addr_str, prefix_str) = try!(cidr_parts(cidr));
|
fn from_cidr(cidr: &str) -> Result<Ipv6Network, IpNetworkError> {
|
||||||
let addr = try!(Ipv6Addr::from_str(addr_str)
|
cidr.parse()
|
||||||
.map_err(|_| IpNetworkError::InvalidAddr(format!("{}", addr_str))));
|
|
||||||
let prefix = try!(parse_prefix(prefix_str, IPV6_BITS));
|
|
||||||
Self::new(addr, prefix)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ip(&self) -> Ipv6Addr {
|
pub fn ip(&self) -> Ipv6Addr {
|
||||||
@ -53,7 +50,7 @@ impl Ipv6Network {
|
|||||||
/// use std::net::Ipv6Addr;
|
/// use std::net::Ipv6Addr;
|
||||||
/// use ipnetwork::Ipv6Network;
|
/// use ipnetwork::Ipv6Network;
|
||||||
///
|
///
|
||||||
/// let net = Ipv6Network::from_cidr("ff01::0/32").unwrap();
|
/// let net: Ipv6Network = "ff01::0/32".parse().unwrap();
|
||||||
/// assert_eq!(net.mask(), Ipv6Addr::new(0xffff, 0xffff, 0, 0, 0, 0, 0, 0));
|
/// assert_eq!(net.mask(), Ipv6Addr::new(0xffff, 0xffff, 0, 0, 0, 0, 0, 0));
|
||||||
/// ```
|
/// ```
|
||||||
pub fn mask(&self) -> Ipv6Addr {
|
pub fn mask(&self) -> Ipv6Addr {
|
||||||
@ -75,7 +72,7 @@ impl Ipv6Network {
|
|||||||
/// use std::net::Ipv6Addr;
|
/// use std::net::Ipv6Addr;
|
||||||
/// use ipnetwork::Ipv6Network;
|
/// use ipnetwork::Ipv6Network;
|
||||||
///
|
///
|
||||||
/// let net = Ipv6Network::from_cidr("ff01::0/32").unwrap();
|
/// let net: Ipv6Network = "ff01::0/32".parse().unwrap();
|
||||||
/// assert!(net.contains(Ipv6Addr::new(0xff01, 0, 0, 0, 0, 0, 0, 0x1)));
|
/// assert!(net.contains(Ipv6Addr::new(0xff01, 0, 0, 0, 0, 0, 0, 0x1)));
|
||||||
/// assert!(!net.contains(Ipv6Addr::new(0xffff, 0, 0, 0, 0, 0, 0, 0x1)));
|
/// assert!(!net.contains(Ipv6Addr::new(0xffff, 0, 0, 0, 0, 0, 0, 0x1)));
|
||||||
/// ```
|
/// ```
|
||||||
@ -83,9 +80,18 @@ impl Ipv6Network {
|
|||||||
let a = self.addr.segments();
|
let a = self.addr.segments();
|
||||||
let b = ip.segments();
|
let b = ip.segments();
|
||||||
let addrs = Iterator::zip(a.iter(), b.iter());
|
let addrs = Iterator::zip(a.iter(), b.iter());
|
||||||
self.mask().segments().iter().zip(addrs).all(|(mask, (a, b))|
|
self.mask().segments().iter().zip(addrs).all(|(mask, (a, b))| a & mask == b & mask)
|
||||||
a & mask == b & mask
|
}
|
||||||
)
|
}
|
||||||
|
|
||||||
|
impl FromStr for Ipv6Network {
|
||||||
|
type Err = IpNetworkError;
|
||||||
|
fn from_str(s: &str) -> Result<Ipv6Network, IpNetworkError> {
|
||||||
|
let (addr_str, prefix_str) = try!(cidr_parts(s));
|
||||||
|
let addr = try!(Ipv6Addr::from_str(addr_str)
|
||||||
|
.map_err(|_| IpNetworkError::InvalidAddr(format!("{}", addr_str))));
|
||||||
|
let prefix = try!(parse_prefix(prefix_str, IPV6_BITS));
|
||||||
|
Ipv6Network::new(addr, prefix)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,28 +155,28 @@ mod test {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_v6() {
|
fn parse_v6() {
|
||||||
let cidr = Ipv6Network::from_cidr("::1/0").unwrap();
|
let cidr: Ipv6Network = "::1/0".parse().unwrap();
|
||||||
assert_eq!(cidr.ip(), Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));
|
assert_eq!(cidr.ip(), Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));
|
||||||
assert_eq!(cidr.prefix(), 0);
|
assert_eq!(cidr.prefix(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_v6_2() {
|
fn parse_v6_2() {
|
||||||
let cidr = Ipv6Network::from_cidr("FF01:0:0:17:0:0:0:2/64").unwrap();
|
let cidr: Ipv6Network = "FF01:0:0:17:0:0:0:2/64".parse().unwrap();
|
||||||
assert_eq!(cidr.ip(), Ipv6Addr::new(0xff01, 0, 0, 0x17, 0, 0, 0, 0x2));
|
assert_eq!(cidr.ip(), Ipv6Addr::new(0xff01, 0, 0, 0x17, 0, 0, 0, 0x2));
|
||||||
assert_eq!(cidr.prefix(), 64);
|
assert_eq!(cidr.prefix(), 64);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_v6_fail_addr() {
|
fn parse_v6_fail_addr() {
|
||||||
let cidr = Ipv6Network::from_cidr("2001::1::/8");
|
let cidr: Option<Ipv6Network> = "2001::1::/8".parse().ok();
|
||||||
assert!(cidr.is_err());
|
assert_eq!(None, cidr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_v6_fail_prefix() {
|
fn parse_v6_fail_prefix() {
|
||||||
let cidr = Ipv6Network::from_cidr("::1/129");
|
let cidr: Option<Ipv6Network> = "::1/129".parse().ok();
|
||||||
assert!(cidr.is_err());
|
assert_eq!(None, cidr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
Reference in New Issue
Block a user