diff --git a/src/lib.rs b/src/lib.rs index 5fa5f27..49dfd84 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,9 +14,6 @@ extern crate serde; #[macro_use] extern crate serde_derive; -#[cfg(feature = "with-serde")] -use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; - use std::fmt; use std::net::IpAddr; @@ -32,33 +29,14 @@ pub use ipv6::{ipv6_mask_to_prefix, Ipv6Network}; /// Represents a generic network range. This type can have two variants: /// the v4 and the v6 case. +#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "with-serde", serde(untagged))] #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)] pub enum IpNetwork { V4(Ipv4Network), V6(Ipv6Network), } -#[cfg(feature = "with-serde")] -impl<'de> Deserialize<'de> for IpNetwork { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let s = <&str>::deserialize(deserializer)?; - IpNetwork::from_str(s).map_err(de::Error::custom) - } -} - -#[cfg(feature = "with-serde")] -impl Serialize for IpNetwork { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&self.to_string()) - } -} - impl IpNetwork { /// Constructs a new `IpNetwork` from a given `IpAddr` and a prefix denoting the /// network size. If the prefix is larger than 32 (for IPv4) or 128 (for IPv6), this