1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
#![cfg(feature = "serde")] use Inet; use inet::{IpInet, Ipv4Inet, Ipv6Inet}; use serde; use serde_common; use std::net::IpAddr; static NAME_IPV4_CIDR: &str = "Ipv4Inet"; impl serde::Serialize for Ipv4Inet { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::Serializer, { if serializer.is_human_readable() { serializer.serialize_str(&format!("{}", self)) } else { serde_common::serialize_v4( serializer, NAME_IPV4_CIDR, (self.address, self.network_length), ) } } } impl<'de> serde::Deserialize<'de> for Ipv4Inet { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: serde::Deserializer<'de>, { if deserializer.is_human_readable() { let s = String::deserialize(deserializer)?; s.parse().map_err(serde::de::Error::custom) } else { let (addr, network_length) = serde_common::deserialize_v4(deserializer, NAME_IPV4_CIDR)?; Ipv4Inet::new(addr, network_length) .map_err(serde::de::Error::custom) } } } static NAME_IPV6_CIDR: &str = "Ipv6Inet"; impl serde::Serialize for Ipv6Inet { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::Serializer, { if serializer.is_human_readable() { serializer.serialize_str(&format!("{}", self)) } else { serde_common::serialize_v6( serializer, NAME_IPV6_CIDR, (self.address, self.network_length), ) } } } impl<'de> serde::Deserialize<'de> for Ipv6Inet { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: serde::Deserializer<'de>, { if deserializer.is_human_readable() { let s = String::deserialize(deserializer)?; s.parse().map_err(serde::de::Error::custom) } else { let (addr, network_length) = serde_common::deserialize_v6(deserializer, NAME_IPV6_CIDR)?; Ipv6Inet::new(addr, network_length) .map_err(serde::de::Error::custom) } } } static NAME_IP_CIDR: &str = "IpInet"; impl serde::Serialize for IpInet { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::Serializer, { if serializer.is_human_readable() { serializer.serialize_str(&format!("{}", self)) } else { let data = match *self { IpInet::V4(ref i) => (IpAddr::V4(i.address), i.network_length), IpInet::V6(ref i) => (IpAddr::V6(i.address), i.network_length), }; serde_common::serialize(serializer, NAME_IP_CIDR, data) } } } impl<'de> serde::Deserialize<'de> for IpInet { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: serde::Deserializer<'de>, { if deserializer.is_human_readable() { let s = String::deserialize(deserializer)?; s.parse().map_err(serde::de::Error::custom) } else { let (addr, network_length) = serde_common::deserialize(deserializer, NAME_IP_CIDR)?; IpInet::new(addr, network_length).map_err(serde::de::Error::custom) } } } #[cfg(test)] mod tests;