Kaynağa Gözat

Implement Serialize and Deserialze for Host

Connor Brewster 9 yıl önce
ebeveyn
işleme
2aaa19032e
2 değiştirilmiş dosya ile 25 ekleme ve 1 silme
  1. 1 1
      Cargo.toml
  2. 24 0
      src/host.rs

+ 1 - 1
Cargo.toml

@@ -1,7 +1,7 @@
 [package]
 
 name = "url"
-version = "1.3.0"
+version = "1.4.0"
 authors = ["The rust-url developers"]
 
 description = "URL library for Rust, based on the WHATWG URL Standard"

+ 24 - 0
src/host.rs

@@ -57,6 +57,30 @@ pub enum Host<S=String> {
     Ipv6(Ipv6Addr),
 }
 
+#[cfg(feature="serde")]
+impl<S: ::serde::Serialize>  ::serde::Serialize for Host<S> {
+    fn serialize<R>(&self, serializer: &mut R) -> Result<(), R::Error> where R: ::serde::Serializer {
+        use std::net::IpAddr;
+        match *self {
+            Host::Domain(ref s) => Ok(s),
+            Host::Ipv4(addr) => Err(IpAddr::V4(addr)),
+            Host::Ipv6(addr) => Err(IpAddr::V6(addr)),
+        }.serialize(serializer)
+    }
+}
+
+#[cfg(feature="serde")]
+impl<S: ::serde::Deserialize> ::serde::Deserialize for Host<S> {
+    fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error> where D: ::serde::Deserializer {
+        use std::net::IpAddr;
+        Ok(match try!(::serde::Deserialize::deserialize(deserializer)) {
+            Ok(s) => Host::Domain(s),
+            Err(IpAddr::V4(addr)) => Host::Ipv4(addr),
+            Err(IpAddr::V6(addr)) => Host::Ipv6(addr),
+        })
+    }
+}
+
 #[cfg(feature = "heapsize")]
 impl<S: HeapSizeOf> HeapSizeOf for Host<S> {
     fn heap_size_of_children(&self) -> usize {