diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index 38681d9b..4db468a8 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -780,6 +780,44 @@ impl Deserialize for net::Ipv6Addr { /////////////////////////////////////////////////////////////////////////////// +impl Deserialize for net::SocketAddr { + fn deserialize(deserializer: &mut D) -> Result + where D: Deserializer, + { + let s = try!(String::deserialize(deserializer)); + match s.parse() { + Ok(s) => Ok(s), + Err(err) => Err(D::Error::invalid_value(&err.to_string())), + } + } +} + +impl Deserialize for net::SocketAddrV4 { + fn deserialize(deserializer: &mut D) -> Result + where D: Deserializer, + { + let s = try!(String::deserialize(deserializer)); + match s.parse() { + Ok(s) => Ok(s), + Err(err) => Err(D::Error::invalid_value(&err.to_string())), + } + } +} + +impl Deserialize for net::SocketAddrV6 { + fn deserialize(deserializer: &mut D) -> Result + where D: Deserializer, + { + let s = try!(String::deserialize(deserializer)); + match s.parse() { + Ok(s) => Ok(s), + Err(err) => Err(D::Error::invalid_value(&err.to_string())), + } + } +} + +/////////////////////////////////////////////////////////////////////////////// + struct PathBufVisitor; impl Visitor for PathBufVisitor { diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index 71003f82..ac604936 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -710,6 +710,35 @@ impl Serialize for net::Ipv6Addr { /////////////////////////////////////////////////////////////////////////////// +impl Serialize for net::SocketAddr { + fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + where S: Serializer, + { + match *self { + net::SocketAddr::V4(ref addr) => addr.serialize(serializer), + net::SocketAddr::V6(ref addr) => addr.serialize(serializer), + } + } +} + +impl Serialize for net::SocketAddrV4 { + fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + where S: Serializer, + { + self.to_string().serialize(serializer) + } +} + +impl Serialize for net::SocketAddrV6 { + fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + where S: Serializer, + { + self.to_string().serialize(serializer) + } +} + +/////////////////////////////////////////////////////////////////////////////// + impl Serialize for path::Path { fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> where S: Serializer, diff --git a/serde_tests/tests/test_de.rs b/serde_tests/tests/test_de.rs index d265aca3..88f6a9ad 100644 --- a/serde_tests/tests/test_de.rs +++ b/serde_tests/tests/test_de.rs @@ -578,6 +578,11 @@ declare_tests! { test_net_ipv6addr { "::1".parse::().unwrap() => vec![Token::Str("::1")], } + test_net_socketaddr { + "1.2.3.4:1234".parse::().unwrap() => vec![Token::Str("1.2.3.4:1234")], + "1.2.3.4:1234".parse::().unwrap() => vec![Token::Str("1.2.3.4:1234")], + "[::1]:1234".parse::().unwrap() => vec![Token::Str("[::1]:1234")], + } test_num_bigint { BigInt::from_i64(123).unwrap() => vec![Token::Str("123")], BigInt::from_i64(-123).unwrap() => vec![Token::Str("-123")], diff --git a/serde_tests/tests/test_ser.rs b/serde_tests/tests/test_ser.rs index 9fad2caf..bf9bd1ea 100644 --- a/serde_tests/tests/test_ser.rs +++ b/serde_tests/tests/test_ser.rs @@ -273,6 +273,11 @@ declare_ser_tests! { test_net_ipv6addr { "::1".parse::().unwrap() => &[Token::Str("::1")], } + test_net_socketaddr { + "1.2.3.4:1234".parse::().unwrap() => &[Token::Str("1.2.3.4:1234")], + "1.2.3.4:1234".parse::().unwrap() => &[Token::Str("1.2.3.4:1234")], + "[::1]:1234".parse::().unwrap() => &[Token::Str("[::1]:1234")], + } test_num_bigint { BigInt::from_i64(123).unwrap() => &[Token::Str("123")], BigInt::from_i64(-123).unwrap() => &[Token::Str("-123")],