From aa46318425df2ff03cdccf78a75f31425b057fea Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 30 Mar 2017 22:30:31 -0700 Subject: [PATCH] Deserialize impls for &str and &[u8] --- serde/src/de/impls.rs | 65 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index fc61dac1..41698195 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -305,6 +305,71 @@ impl<'de> Deserialize<'de> for String { /////////////////////////////////////////////////////////////////////////////// +struct StrVisitor; + +impl<'a> Visitor<'a> for StrVisitor { + type Value = &'a str; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a borrowed string") + } + + fn visit_borrowed_str(self, v: &'a str) -> Result + where E: Error + { + Ok(v) // so easy + } + + fn visit_borrowed_bytes(self, v: &'a [u8]) -> Result + where E: Error + { + str::from_utf8(v) + .map_err(|_| Error::invalid_value(Unexpected::Bytes(v), &self)) + } +} + +impl<'a> Deserialize<'a> for &'a str { + fn deserialize(deserializer: D) -> Result + where D: Deserializer<'a> + { + deserializer.deserialize_str(StrVisitor) + } +} + +/////////////////////////////////////////////////////////////////////////////// + +struct BytesVisitor; + +impl<'a> Visitor<'a> for BytesVisitor { + type Value = &'a [u8]; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a borrowed byte array") + } + + fn visit_borrowed_bytes(self, v: &'a [u8]) -> Result + where E: Error + { + Ok(v) + } + + fn visit_borrowed_str(self, v: &'a str) -> Result + where E: Error + { + Ok(v.as_bytes()) + } +} + +impl<'a> Deserialize<'a> for &'a [u8] { + fn deserialize(deserializer: D) -> Result + where D: Deserializer<'a> + { + deserializer.deserialize_bytes(BytesVisitor) + } +} + +/////////////////////////////////////////////////////////////////////////////// + #[cfg(all(feature = "std", feature="unstable"))] impl<'de> Deserialize<'de> for Box { fn deserialize(deserializer: D) -> Result