From c2ff51b1b17b55d2b7db4ee32537151e01577721 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Fri, 19 Jul 2019 10:23:43 +0200 Subject: [PATCH] Optimise default string deserialization for Url --- src/lib.rs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 92777e592..4f73ba590 100644 --- a/src/lib.rs +++ b/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(self, s: &str) -> Result + where + E: Error, + { + Url::parse(s).map_err(|err| { + Error::invalid_value(Unexpected::Str(s), &err.description()) + }) + } + } + + deserializer.deserialize_str(UrlVisitor) } }