Skip to content

Commit 0bb9922

Browse files
committed
Use Cow<str> for EscapedDeserializer
1 parent aace826 commit 0bb9922

File tree

3 files changed

+25
-16
lines changed

3 files changed

+25
-16
lines changed

src/de/escape.rs

+8-9
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ use std::borrow::Cow;
1717
#[derive(Clone, Debug)]
1818
pub struct EscapedDeserializer<'a> {
1919
/// Possible escaped value of text/CDATA or attribute value
20-
escaped_value: Cow<'a, [u8]>,
20+
escaped_value: Cow<'a, str>,
2121
/// If `true`, value requires unescaping before using
2222
escaped: bool,
2323
}
2424

2525
impl<'a> EscapedDeserializer<'a> {
26-
pub fn new(escaped_value: Cow<'a, [u8]>, escaped: bool) -> Self {
26+
pub fn new(escaped_value: Cow<'a, str>, escaped: bool) -> Self {
2727
EscapedDeserializer {
2828
escaped_value,
2929
escaped,
@@ -37,7 +37,7 @@ macro_rules! deserialize_num {
3737
where
3838
V: Visitor<'de>,
3939
{
40-
let value = String::from_utf8(self.escaped_value.as_ref().to_vec())?.parse()?; // TODO(dalley): this is temporary
40+
let value = self.escaped_value.parse()?;
4141

4242
visitor.$visit(value)
4343
}
@@ -59,15 +59,14 @@ impl<'de, 'a> serde::Deserializer<'de> for EscapedDeserializer<'a> {
5959
V: Visitor<'de>,
6060
{
6161
if self.escaped {
62-
match unescape(std::str::from_utf8(self.escaped_value.as_ref())?)? {
63-
// TODO(dalley): remove temporary from_utf8
62+
match unescape(self.escaped_value.as_ref())? {
6463
Cow::Borrowed(s) => visitor.visit_str(s),
6564
Cow::Owned(s) => visitor.visit_string(s),
6665
}
6766
} else {
6867
match self.escaped_value {
69-
Cow::Borrowed(s) => visitor.visit_str(std::str::from_utf8(s)?),
70-
Cow::Owned(s) => visitor.visit_string(String::from_utf8(s)?),
68+
Cow::Borrowed(s) => visitor.visit_str(s),
69+
Cow::Owned(s) => visitor.visit_string(s),
7170
}
7271
}
7372
}
@@ -101,7 +100,7 @@ impl<'de, 'a> serde::Deserializer<'de> for EscapedDeserializer<'a> {
101100
where
102101
V: Visitor<'de>,
103102
{
104-
deserialize_bool(self.escaped_value.as_ref(), visitor)
103+
deserialize_bool(&self.escaped_value.as_bytes(), visitor)
105104
}
106105

107106
fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
@@ -122,7 +121,7 @@ impl<'de, 'a> serde::Deserializer<'de> for EscapedDeserializer<'a> {
122121
where
123122
V: Visitor<'de>,
124123
{
125-
if self.escaped_value.as_ref().is_empty() {
124+
if self.escaped_value.is_empty() {
126125
visitor.visit_none()
127126
} else {
128127
visitor.visit_some(self)

src/de/map.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,11 @@ where
236236
// try getting map from attributes (key= "value")
237237
let (key, value) = a.into();
238238
self.source = ValueSource::Attribute(value.unwrap_or_default());
239-
seed.deserialize(EscapedDeserializer::new(Cow::Borrowed(&slice[key]), false))
240-
.map(Some)
239+
seed.deserialize(EscapedDeserializer::new(
240+
Cow::Borrowed(std::str::from_utf8(&slice[key])?),
241+
false,
242+
)) // TODO(dalley): this is temporary
243+
.map(Some)
241244
} else {
242245
// try getting from events (<key>value</key>)
243246
match self.de.peek()? {
@@ -288,8 +291,8 @@ where
288291
// }
289292
seed.deserialize(self.unflatten_fields.remove(p).into_deserializer())
290293
} else {
291-
let name = Cow::Borrowed(e.local_name().into_inner());
292-
seed.deserialize(EscapedDeserializer::new(name, false))
294+
let name = std::str::from_utf8(e.local_name().into_inner())?; // TODO(dalley): this is temporary
295+
seed.deserialize(EscapedDeserializer::new(Cow::Borrowed(name), false))
293296
};
294297
key.map(Some)
295298
}

src/de/var.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,18 @@ where
3434
V: DeserializeSeed<'de>,
3535
{
3636
let de = match self.de.peek()? {
37-
DeEvent::Text(t) => EscapedDeserializer::new(Cow::Borrowed(t), true),
37+
DeEvent::Text(t) => {
38+
EscapedDeserializer::new(Cow::Borrowed(std::str::from_utf8(t)?), true)
39+
} // TODO(dalley): temporary
3840
// Escape sequences does not processed inside CDATA section
39-
DeEvent::CData(t) => EscapedDeserializer::new(Cow::Borrowed(t), false),
41+
DeEvent::CData(t) => {
42+
EscapedDeserializer::new(Cow::Borrowed(std::str::from_utf8(t)?), false)
43+
} // TODO(dalley): temporary
4044
DeEvent::Start(e) => {
41-
EscapedDeserializer::new(Cow::Borrowed(e.name().into_inner()), false)
45+
EscapedDeserializer::new(
46+
Cow::Borrowed(std::str::from_utf8(e.name().into_inner())?),
47+
false,
48+
) // TODO(dalley): temporary
4249
}
4350
_ => {
4451
return Err(DeError::Unsupported(

0 commit comments

Comments
 (0)