From 17e96ae76422dd274c3f88e55c09c4ea19426c27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20F=C3=A4rnstrand?= Date: Mon, 20 Jun 2016 01:00:19 +0200 Subject: [PATCH 1/5] Make the network structs/enums clonable --- src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 8af5242..9e12a99 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,17 +12,19 @@ const IPV4_BITS: u8 = 32; const IPV6_BITS: u8 = 128; // A network -#[derive(Debug)] +#[derive(Debug,Clone)] pub enum IpNetwork { V4(Ipv4Network), V6(Ipv6Network), } +#[derive(Clone)] pub struct Ipv4Network { addr: Ipv4Addr, prefix: u8, } +#[derive(Clone)] pub struct Ipv6Network { addr: Ipv6Addr, prefix: u8, From b50643fbae866d8e630d9b395a36f02a8bfc6675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20F=C3=A4rnstrand?= Date: Mon, 20 Jun 2016 13:18:44 +0200 Subject: [PATCH 2/5] Make structs Copy,Hash,Eq,PartialEq --- src/lib.rs | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 9e12a99..a04bc51 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,19 +12,19 @@ const IPV4_BITS: u8 = 32; const IPV6_BITS: u8 = 128; // A network -#[derive(Debug,Clone)] +#[derive(Debug,Clone,Copy,Hash,PartialEq,Eq)] pub enum IpNetwork { V4(Ipv4Network), V6(Ipv6Network), } -#[derive(Clone)] +#[derive(Clone,Copy,Hash,PartialEq,Eq)] pub struct Ipv4Network { addr: Ipv4Addr, prefix: u8, } -#[derive(Clone)] +#[derive(Clone,Copy,Hash,PartialEq,Eq)] pub struct Ipv6Network { addr: Ipv6Addr, prefix: u8, @@ -239,6 +239,8 @@ fn parse_prefix(prefix: &str, max: u8) -> Result { #[cfg(test)] mod test { + use std::mem; + use std::collections::HashMap; use std::net::{Ipv4Addr, Ipv6Addr}; use super::*; @@ -345,6 +347,24 @@ mod test { assert!(net.nth(1).is_none()); } + #[test] + fn hash_eq_compatibility_v4() { + let mut map = HashMap::new(); + let net = Ipv4Network::new(Ipv4Addr::new(127, 0, 0, 1), 16).unwrap(); + map.insert(net, 137); + let out = map.get(&net).unwrap(); + assert_eq!(137, *out); + } + + #[test] + fn copy_compatibility_v4() { + let net = Ipv4Network::new(Ipv4Addr::new(127, 0, 0, 1), 16).unwrap(); + mem::drop(net); + assert_eq!(16, net.prefix()); + } + + + #[test] fn create_v6() { let cidr = Ipv6Network::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 24).unwrap(); From 7dcbf53a0f3d6a9f9a316b2daa1a7c64bd44b33f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20F=C3=A4rnstrand?= Date: Mon, 20 Jun 2016 13:20:28 +0200 Subject: [PATCH 3/5] Make IpNetworkError Clone,Eq,PartialEq --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index a04bc51..8e1c9f6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,7 +30,7 @@ pub struct Ipv6Network { prefix: u8, } -#[derive(Debug)] +#[derive(Debug,Clone,PartialEq,Eq)] pub enum IpNetworkError { InvalidAddr(String), InvalidPrefix, From b5b0856a04623e43de78e0fd664329b6e376dea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20F=C3=A4rnstrand?= Date: Mon, 20 Jun 2016 13:20:40 +0200 Subject: [PATCH 4/5] Formatting --- src/lib.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 8e1c9f6..0878755 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -167,9 +167,8 @@ impl Ipv6Network { pub fn from_cidr(cidr: &str) -> Result { let (addr_str, prefix_str) = try!(cidr_parts(cidr)); - let addr = try!(Ipv6Addr::from_str(addr_str).map_err(|_| { - IpNetworkError::InvalidAddr(format!("{}", addr_str)) - })); + let addr = try!(Ipv6Addr::from_str(addr_str) + .map_err(|_| IpNetworkError::InvalidAddr(format!("{}", addr_str)))); let prefix = try!(parse_prefix(prefix_str, IPV6_BITS)); Self::new(addr, prefix) } From 31d890735d89aae1527b037e4e9846291e236002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20F=C3=A4rnstrand?= Date: Mon, 20 Jun 2016 15:55:35 +0200 Subject: [PATCH 5/5] Manually implement Display, uglier debug --- src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0878755..34fe740 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,13 +18,13 @@ pub enum IpNetwork { V6(Ipv6Network), } -#[derive(Clone,Copy,Hash,PartialEq,Eq)] +#[derive(Debug,Clone,Copy,Hash,PartialEq,Eq)] pub struct Ipv4Network { addr: Ipv4Addr, prefix: u8, } -#[derive(Clone,Copy,Hash,PartialEq,Eq)] +#[derive(Debug,Clone,Copy,Hash,PartialEq,Eq)] pub struct Ipv6Network { addr: Ipv6Addr, prefix: u8, @@ -205,13 +205,13 @@ impl IpNetwork { } } -impl fmt::Debug for Ipv4Network { +impl fmt::Display for Ipv4Network { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { write!(fmt, "{}/{}", self.ip(), self.prefix()) } } -impl fmt::Debug for Ipv6Network { +impl fmt::Display for Ipv6Network { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { write!(fmt, "{}/{}", self.ip(), self.prefix()) }