9 Commits

Author SHA1 Message Date
cdd3dff549 Merge pull request #44 from achanda/release
Uprev for release
2017-04-13 16:41:36 +01:00
ef378f9921 Uprev for release 2017-04-13 16:40:13 +01:00
b70b551561 Merge pull request #43 from faern/fix-doc-test
Fix failing doc test
2017-04-03 09:22:18 +01:00
b442a7d598 Merge pull request #42 from faern/simplify-from-str
Simplify IpNetwork::from_str impl and update docs
2017-04-03 09:22:06 +01:00
5020a99401 Add punctuation 2017-04-02 18:56:25 +02:00
24c9a24dae Fix failing doc test 2017-04-02 17:51:30 +02:00
b3fd9f4f48 Simplify IpNetwork::from_str impl and update docs 2017-04-02 17:50:20 +02:00
04d454b5ba Merge pull request #41 from faern/impl-display
Implement Display for IpNetwork
2017-04-02 16:47:48 +01:00
f61db46006 Implement Display for IpNetwork 2017-04-02 17:30:06 +02:00
2 changed files with 29 additions and 18 deletions

View File

@ -1,6 +1,6 @@
[package] [package]
name = "ipnetwork" name = "ipnetwork"
version = "0.12.2" version = "0.12.3"
authors = ["Abhishek Chanda <abhishek.becs@gmail.com>", "Linus Färnstrand <faern@faern.net>"] authors = ["Abhishek Chanda <abhishek.becs@gmail.com>", "Linus Färnstrand <faern@faern.net>"]
description = "A library to work with IP CIDRs in Rust, heavily WIP" description = "A library to work with IP CIDRs in Rust, heavily WIP"
license = "Apache-2.0" license = "Apache-2.0"

View File

@ -5,6 +5,7 @@
#![cfg_attr(feature = "dev", plugin(clippy))] #![cfg_attr(feature = "dev", plugin(clippy))]
#![crate_type = "lib"] #![crate_type = "lib"]
use std::fmt;
use std::net::IpAddr; use std::net::IpAddr;
mod ipv4; mod ipv4;
@ -61,14 +62,18 @@ impl IpNetwork {
} }
} }
/// Returns the mask of the given `IpNetwork` /// Returns the mask for this `IpNetwork`.
/// That means the `prefix` most significant bits will be 1 and the rest 0
/// ///
/// # Example /// # Example
/// ``` /// ```
/// use ipnetwork::IpNetwork; /// use ipnetwork::IpNetwork;
/// use std::net::{Ipv4Addr, Ipv6Addr};
/// ///
/// assert_eq!(IpNetwork::V4("10.9.0.32/16".parse().unwrap()).mask(), 16u8); /// let v4_net: IpNetwork = "10.9.0.32/16".parse().unwrap();
/// assert_eq!(IpNetwork::V6("ff01::0/32".parse().unwrap()).mask(), 32u8); /// assert_eq!(v4_net.mask(), Ipv4Addr::new(255, 255, 0, 0));
/// let v6_net: IpNetwork = "ff01::0/32".parse().unwrap();
/// assert_eq!(v6_net.mask(), Ipv6Addr::new(0xffff, 0xffff, 0, 0, 0, 0, 0, 0));
///``` ///```
pub fn mask(&self) -> IpAddr { pub fn mask(&self) -> IpAddr {
match *self { match *self {
@ -116,30 +121,27 @@ impl IpNetwork {
} }
} }
/// Constructs a new `IpNetwork` from a given &str with a prefix denoting the /// Tries to parse the given string into a `IpNetwork`. Will first try to parse
/// network size. If the prefix is larger than 32 (for IPv4) or 128 (for IPv6), this /// it as an `Ipv4Network` and if that fails as an `Ipv6Network`. If both
/// will raise an `IpNetworkError::InvalidPrefix` error. /// fails it will return an `InvalidAddr` error.
///
/// # Examples /// # Examples
/// ///
/// ``` /// ```
/// use std::net::Ipv4Addr; /// use std::net::Ipv4Addr;
/// use ipnetwork::Ipv4Network; /// use ipnetwork::{IpNetwork, Ipv4Network};
/// use ipnetwork::IpNetwork;
/// ///
/// let expected = IpNetwork::V4(Ipv4Network::new(Ipv4Addr::new(10, 1, 9, 32), 16).unwrap()); /// let expected = IpNetwork::V4(Ipv4Network::new(Ipv4Addr::new(10, 1, 9, 32), 16).unwrap());
/// let from_cidr: IpNetwork = "10.1.9.32/16".parse().unwrap(); /// let from_cidr: IpNetwork = "10.1.9.32/16".parse().unwrap();
/// assert_eq!(expected.ip(), from_cidr.ip()); /// assert_eq!(expected, from_cidr);
/// assert_eq!(expected.prefix(), from_cidr.prefix()); /// ```
impl FromStr for IpNetwork { impl FromStr for IpNetwork {
type Err = IpNetworkError; type Err = IpNetworkError;
fn from_str(s: &str) -> Result<IpNetwork, IpNetworkError> { fn from_str(s: &str) -> Result<IpNetwork, IpNetworkError> {
let v4addr: Result<Ipv4Network, IpNetworkError> = s.parse(); if let Ok(net) = Ipv4Network::from_str(s) {
let v6addr: Result<Ipv6Network, IpNetworkError> = s.parse(); Ok(IpNetwork::V4(net))
} else if let Ok(net) = Ipv6Network::from_str(s) {
if v4addr.is_ok() { Ok(IpNetwork::V6(net))
Ok(IpNetwork::V4(v4addr.unwrap()))
} else if v6addr.is_ok() {
Ok(IpNetwork::V6(v6addr.unwrap()))
} else { } else {
Err(IpNetworkError::InvalidAddr(s.to_string())) Err(IpNetworkError::InvalidAddr(s.to_string()))
} }
@ -158,6 +160,15 @@ impl From<Ipv6Network> for IpNetwork {
} }
} }
impl fmt::Display for IpNetwork {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
IpNetwork::V4(net) => net.fmt(f),
IpNetwork::V6(net) => net.fmt(f),
}
}
}
/// Converts a `IpAddr` network mask into a prefix. /// Converts a `IpAddr` network mask into a prefix.
/// If the mask is invalid this will return an `IpNetworkError::InvalidPrefix`. /// If the mask is invalid this will return an `IpNetworkError::InvalidPrefix`.
pub fn ip_mask_to_prefix(mask: IpAddr) -> Result<u8, IpNetworkError> { pub fn ip_mask_to_prefix(mask: IpAddr) -> Result<u8, IpNetworkError> {