Переглянути джерело

Optimise default string deserialization for Url

Anthony Ramine 7 роки тому
батько
коміт
c2ff51b1b1
1 змінених файлів з 22 додано та 5 видалено
  1. 22 5
      src/lib.rs

+ 22 - 5
src/lib.rs

@@ -2281,11 +2281,28 @@ impl<'de> serde::Deserialize<'de> for Url {
     where
         D: serde::Deserializer<'de>,
     {
-        use serde::de::{Error, Unexpected};
-        let string_representation: String = serde::Deserialize::deserialize(deserializer)?;
-        Url::parse(&string_representation).map_err(|err| {
-            Error::invalid_value(Unexpected::Str(&string_representation), &err.description())
-        })
+        use serde::de::{Error, Unexpected, Visitor};
+
+        struct UrlVisitor;
+
+        impl<'de> Visitor<'de> for UrlVisitor {
+            type Value = Url;
+
+            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+                formatter.write_str("a string representing an URL")
+            }
+
+            fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
+            where
+                E: Error,
+            {
+                Url::parse(s).map_err(|err| {
+                    Error::invalid_value(Unexpected::Str(s), &err.description())
+                })
+            }
+        }
+
+        deserializer.deserialize_str(UrlVisitor)
     }
 }