Skip to content

Commit c2ff51b

Browse files
committed
Optimise default string deserialization for Url
1 parent 171e65e commit c2ff51b

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

src/lib.rs

+22-5
Original file line numberDiff line numberDiff line change
@@ -2281,11 +2281,28 @@ impl<'de> serde::Deserialize<'de> for Url {
22812281
where
22822282
D: serde::Deserializer<'de>,
22832283
{
2284-
use serde::de::{Error, Unexpected};
2285-
let string_representation: String = serde::Deserialize::deserialize(deserializer)?;
2286-
Url::parse(&string_representation).map_err(|err| {
2287-
Error::invalid_value(Unexpected::Str(&string_representation), &err.description())
2288-
})
2284+
use serde::de::{Error, Unexpected, Visitor};
2285+
2286+
struct UrlVisitor;
2287+
2288+
impl<'de> Visitor<'de> for UrlVisitor {
2289+
type Value = Url;
2290+
2291+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2292+
formatter.write_str("a string representing an URL")
2293+
}
2294+
2295+
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
2296+
where
2297+
E: Error,
2298+
{
2299+
Url::parse(s).map_err(|err| {
2300+
Error::invalid_value(Unexpected::Str(s), &err.description())
2301+
})
2302+
}
2303+
}
2304+
2305+
deserializer.deserialize_str(UrlVisitor)
22892306
}
22902307
}
22912308

0 commit comments

Comments
 (0)