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
use serde::{de, Deserialize, Deserializer}; use super::Netv4Addr; #[cfg(feature = "serde")] struct Netv4AddrVisitor; #[cfg(feature = "serde")] impl<'de> de::Visitor<'de> for Netv4AddrVisitor { type Value = Netv4Addr; fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result { formatter.write_str("a valid cidr/extended network address") } fn visit_str<E: de::Error>(self, value: &str) -> Result<Self::Value, E> { use core::str::FromStr; Self::Value::from_str(value).map_err(de::Error::custom) } } #[cfg(feature = "serde")] impl<'de> Deserialize<'de> for Netv4Addr { fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> { deserializer.deserialize_str(Netv4AddrVisitor) } } #[cfg(test)] mod tests { use super::Netv4Addr; use serde_test::{assert_de_tokens, Token}; #[test] fn test_de_cidr_localhost() { let netaddr: Netv4Addr = "127.0.0.1/8".parse().unwrap(); assert_de_tokens(&netaddr, &[Token::Str("127.0.0.0/8")]); } #[test] fn test_de_non_cidr_localhost() { let netaddr: Netv4Addr = "127.0.0.1/251.255.255.7".parse().unwrap(); assert_de_tokens(&netaddr, &[Token::Str("123.0.0.1/251.255.255.7")]); } }