From abc3b6fca6a4183fbedfcc61344e359b22669a32 Mon Sep 17 00:00:00 2001 From: Kris Price Date: Mon, 4 Jun 2018 21:21:47 -0700 Subject: [PATCH] Fixing Serialize impl for Ipv4Net and Ipv6Net per issue #10 --- src/ipnet.rs | 2 ++ src/with_serde.rs | 22 ++++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/ipnet.rs b/src/ipnet.rs index 5697ec6..097f2a8 100644 --- a/src/ipnet.rs +++ b/src/ipnet.rs @@ -72,6 +72,7 @@ pub enum IpNet { /// let net: Ipv4Net = "10.1.1.0/24".parse().unwrap(); /// assert_eq!(Ok(net.network()), "10.1.1.0".parse()); /// ``` +//#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)] pub struct Ipv4Net { addr: Ipv4Addr, @@ -102,6 +103,7 @@ pub struct Ipv4Net { /// let net: Ipv6Net = "fd00::/32".parse().unwrap(); /// assert_eq!(Ok(net.network()), "fd00::".parse()); /// ``` +//#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)] pub struct Ipv6Net { addr: Ipv6Addr, diff --git a/src/with_serde.rs b/src/with_serde.rs index 02d5bd1..d51babb 100644 --- a/src/with_serde.rs +++ b/src/with_serde.rs @@ -13,9 +13,16 @@ impl<'de> Deserialize<'de> for Ipv4Net { impl Serialize for Ipv4Net { fn serialize(&self, serializer: S) -> Result - where S: Serializer + where S: Serializer, { - serializer.serialize_str(&self.to_string()) + if serializer.is_human_readable() { + serializer.serialize_str(&self.to_string()) + } else { + let mut v: Vec = vec![]; + v.extend_from_slice(&self.octets()); + v.push(self.prefix_len()); + v.serialize(serializer) + } } } @@ -33,7 +40,14 @@ impl Serialize for Ipv6Net { fn serialize(&self, serializer: S) -> Result where S: Serializer { - serializer.serialize_str(&self.to_string()) + if serializer.is_human_readable() { + serializer.serialize_str(&self.to_string()) + } else { + let mut v: Vec = vec![]; + v.extend_from_slice(&self.octets()); + v.push(self.prefix_len()); + v.serialize(serializer) + } } } @@ -71,4 +85,4 @@ mod tests { let net: IpNet = net_str.parse().unwrap(); assert_tokens(&net.readable(), &[Token::Str(net_str)]); } -} +} \ No newline at end of file