Skip to content

Commit 553a9ef

Browse files
committed
Convert namespace-related structs to str
1 parent 182d794 commit 553a9ef

25 files changed

+424
-471
lines changed

benches/microbenches.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ fn attributes(c: &mut Criterion) {
224224
let mut count = criterion::black_box(0);
225225
loop {
226226
match r.read_event() {
227-
Ok(Event::Empty(e)) if e.name() == QName(b"player") => {
227+
Ok(Event::Empty(e)) if e.name() == QName("player") => {
228228
for name in ["num", "status", "avg"] {
229229
if let Some(_attr) = e.try_get_attribute(name).unwrap() {
230230
count += 1

examples/custom_entities.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
4141
}
4242
}
4343
Ok(Event::Start(ref e)) => match e.name().as_ref() {
44-
b"test" => {
44+
"test" => {
4545
let attributes = e
4646
.attributes()
4747
.map(|a| {

examples/nested_readers.rs

+5-8
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ fn main() -> Result<(), quick_xml::Error> {
2222
loop {
2323
match reader.read_event_into(&mut buf)? {
2424
Event::Start(element) => match element.name().as_ref() {
25-
b"w:tbl" => {
25+
"w:tbl" => {
2626
count += 1;
2727
let mut stats = TableStat {
2828
index: count,
@@ -35,20 +35,17 @@ fn main() -> Result<(), quick_xml::Error> {
3535
skip_buf.clear();
3636
match reader.read_event_into(&mut skip_buf)? {
3737
Event::Start(element) => match element.name().as_ref() {
38-
b"w:tr" => {
38+
"w:tr" => {
3939
stats.rows.push(vec![]);
4040
row_index = stats.rows.len() - 1;
4141
}
42-
b"w:tc" => {
43-
stats.rows[row_index].push(
44-
String::from_utf8(element.name().as_ref().to_vec())
45-
.unwrap(),
46-
);
42+
"w:tc" => {
43+
stats.rows[row_index].push(element.name().as_ref().to_owned());
4744
}
4845
_ => {}
4946
},
5047
Event::End(element) => {
51-
if element.name().as_ref() == b"w:tbl" {
48+
if element.name().as_ref() == "w:tbl" {
5249
found_tables.push(stats);
5350
break;
5451
}

examples/read_buffered.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ fn main() -> Result<(), quick_xml::Error> {
1717
loop {
1818
match reader.read_event_into(&mut buf) {
1919
Ok(Event::Start(ref e)) => {
20-
let name = e.name();
21-
let name = reader.decoder().decode(name.as_ref())?;
22-
println!("read start event {:?}", name.as_ref());
20+
println!("read start event {:?}", e.name().as_ref());
2321
count += 1;
2422
}
2523
Ok(Event::Eof) => break, // exits the loop when reaching end of file

examples/read_texts.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ fn main() {
1212
let mut txt = Vec::new();
1313
loop {
1414
match reader.read_event() {
15-
Ok(Event::Start(ref e)) if e.name().as_ref() == b"tag2" => {
15+
Ok(Event::Start(ref e)) if e.name().as_ref() == "tag2" => {
1616
txt.push(
1717
reader
18-
.read_text(QName(b"tag2"))
18+
.read_text_into(QName("tag2"), &mut Vec::new())
1919
.expect("Cannot decode text value"),
2020
);
2121
println!("{:?}", txt);

src/de/escape.rs

+6-10
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! Serde `Deserializer` module
22
33
use crate::de::deserialize_bool;
4-
use crate::encoding::Decoder;
54
use crate::errors::serialize::DeError;
65
use crate::escape::unescape;
76
use serde::de::{DeserializeSeed, EnumAccess, VariantAccess, Visitor};
@@ -17,17 +16,15 @@ use std::borrow::Cow;
1716
/// anyway
1817
#[derive(Clone, Debug)]
1918
pub struct EscapedDeserializer<'a> {
20-
decoder: Decoder,
2119
/// Possible escaped value of text/CDATA or attribute value
22-
escaped_value: Cow<'a, [u8]>,
20+
escaped_value: Cow<'a, str>,
2321
/// If `true`, value requires unescaping before using
2422
escaped: bool,
2523
}
2624

2725
impl<'a> EscapedDeserializer<'a> {
28-
pub fn new(escaped_value: Cow<'a, [u8]>, decoder: Decoder, escaped: bool) -> Self {
26+
pub fn new(escaped_value: Cow<'a, str>, escaped: bool) -> Self {
2927
EscapedDeserializer {
30-
decoder,
3128
escaped_value,
3229
escaped,
3330
}
@@ -40,7 +37,7 @@ macro_rules! deserialize_num {
4037
where
4138
V: Visitor<'de>,
4239
{
43-
let value = self.decoder.decode(self.escaped_value.as_ref())?.parse()?;
40+
let value = self.escaped_value.as_ref().parse()?;
4441

4542
visitor.$visit(value)
4643
}
@@ -61,14 +58,13 @@ impl<'de, 'a> serde::Deserializer<'de> for EscapedDeserializer<'a> {
6158
where
6259
V: Visitor<'de>,
6360
{
64-
let decoded = self.decoder.decode(&self.escaped_value)?;
6561
if self.escaped {
66-
match unescape(&decoded)? {
62+
match unescape(&self.escaped_value)? {
6763
Cow::Borrowed(s) => visitor.visit_str(s),
6864
Cow::Owned(s) => visitor.visit_string(s),
6965
}
7066
} else {
71-
match decoded {
67+
match self.escaped_value {
7268
Cow::Borrowed(s) => visitor.visit_str(s),
7369
Cow::Owned(s) => visitor.visit_string(s),
7470
}
@@ -104,7 +100,7 @@ impl<'de, 'a> serde::Deserializer<'de> for EscapedDeserializer<'a> {
104100
where
105101
V: Visitor<'de>,
106102
{
107-
deserialize_bool(self.escaped_value.as_ref(), self.decoder, visitor)
103+
deserialize_bool(self.escaped_value.as_ref(), visitor)
108104
}
109105

110106
fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>

src/de/map.rs

+24-28
Original file line numberDiff line numberDiff line change
@@ -231,15 +231,13 @@ where
231231

232232
// FIXME: There error positions counted from the start of tag name - need global position
233233
let slice = &self.start.buf;
234-
let decoder = self.de.reader.decoder();
235234

236235
if let Some(a) = self.iter.next(slice).transpose()? {
237236
// try getting map from attributes (key= "value")
238237
let (key, value) = a.into();
239238
self.source = ValueSource::Attribute(value.unwrap_or_default());
240239
seed.deserialize(EscapedDeserializer::new(
241-
Cow::Borrowed(&slice[key]),
242-
decoder,
240+
Cow::Borrowed(std::str::from_utf8(&slice[key]).expect("fixme dalley")),
243241
false,
244242
))
245243
.map(Some)
@@ -269,33 +267,32 @@ where
269267
// }
270268
// TODO: This should be handled by #[serde(flatten)]
271269
// See https://github.com/serde-rs/serde/issues/1905
272-
DeEvent::Start(e) if self.has_value_field && not_in(self.fields, e, decoder)? => {
270+
DeEvent::Start(e) if self.has_value_field && not_in(self.fields, e)? => {
273271
self.source = ValueSource::Content;
274272
seed.deserialize(INNER_VALUE.into_deserializer()).map(Some)
275273
}
276274
DeEvent::Start(e) => {
277275
self.source = ValueSource::Nested;
278-
let key = if let Some(p) = self
279-
.unflatten_fields
280-
.iter()
281-
.position(|f| e.name().as_ref() == &f[UNFLATTEN_PREFIX.len()..])
282-
{
283-
// Used to deserialize elements, like:
284-
// <root>
285-
// <xxx>test</xxx>
286-
// </root>
287-
//
288-
// into
289-
//
290-
// struct Root {
291-
// #[serde(rename = "$unflatten=xxx")]
292-
// xxx: String,
293-
// }
294-
seed.deserialize(self.unflatten_fields.remove(p).into_deserializer())
295-
} else {
296-
let name = Cow::Borrowed(e.local_name().into_inner());
297-
seed.deserialize(EscapedDeserializer::new(name, decoder, false))
298-
};
276+
let key =
277+
if let Some(p) = self.unflatten_fields.iter().position(|f| {
278+
e.name().as_ref().as_bytes() == &f[UNFLATTEN_PREFIX.len()..]
279+
}) {
280+
// Used to deserialize elements, like:
281+
// <root>
282+
// <xxx>test</xxx>
283+
// </root>
284+
//
285+
// into
286+
//
287+
// struct Root {
288+
// #[serde(rename = "$unflatten=xxx")]
289+
// xxx: String,
290+
// }
291+
seed.deserialize(self.unflatten_fields.remove(p).into_deserializer())
292+
} else {
293+
let name = Cow::Borrowed(e.local_name().into_inner());
294+
seed.deserialize(EscapedDeserializer::new(name, false))
295+
};
299296
key.map(Some)
300297
}
301298
// Stop iteration after reaching a closing tag
@@ -616,18 +613,17 @@ where
616613
where
617614
T: DeserializeSeed<'de>,
618615
{
619-
let decoder = self.map.de.reader.decoder();
620616
loop {
621617
break match self.map.de.peek()? {
622618
// If we see a tag that we not interested, skip it
623619
#[cfg(feature = "overlapped-lists")]
624-
DeEvent::Start(e) if !self.filter.is_suitable(&e, decoder)? => {
620+
DeEvent::Start(e) if !self.filter.is_suitable(&e)? => {
625621
self.map.de.skip()?;
626622
continue;
627623
}
628624
// Stop iteration when list elements ends
629625
#[cfg(not(feature = "overlapped-lists"))]
630-
DeEvent::Start(e) if !self.filter.is_suitable(&e, decoder)? => Ok(None),
626+
DeEvent::Start(e) if !self.filter.is_suitable(&e)? => Ok(None),
631627

632628
// Stop iteration after reaching a closing tag
633629
DeEvent::End(e) if e.name() == self.map.start.name() => Ok(None),

src/de/mod.rs

+10-29
Original file line numberDiff line numberDiff line change
@@ -325,30 +325,12 @@ where
325325
}
326326
}
327327

328-
fn deserialize_bool<'de, V>(value: &[u8], decoder: Decoder, visitor: V) -> Result<V::Value, DeError>
328+
fn deserialize_bool<'de, V>(value: &str, visitor: V) -> Result<V::Value, DeError>
329329
where
330330
V: Visitor<'de>,
331331
{
332-
#[cfg(feature = "encoding")]
333-
{
334-
let value = decoder.decode(value)?;
335-
// No need to unescape because valid boolean representations cannot be escaped
336-
str2bool(value.as_ref(), visitor)
337-
}
338-
339-
#[cfg(not(feature = "encoding"))]
340-
{
341-
// No need to unescape because valid boolean representations cannot be escaped
342-
match value {
343-
b"true" | b"1" | b"True" | b"TRUE" | b"t" | b"Yes" | b"YES" | b"yes" | b"y" => {
344-
visitor.visit_bool(true)
345-
}
346-
b"false" | b"0" | b"False" | b"FALSE" | b"f" | b"No" | b"NO" | b"no" | b"n" => {
347-
visitor.visit_bool(false)
348-
}
349-
e => Err(DeError::InvalidBoolean(decoder.decode(e)?.into())),
350-
}
351-
}
332+
// No need to unescape because valid boolean representations cannot be escaped
333+
str2bool(value.as_ref(), visitor)
352334
}
353335

354336
impl<'de, R> Deserializer<'de, R>
@@ -738,10 +720,9 @@ where
738720
{
739721
// Try to go to the next `<tag ...>...</tag>` or `<tag .../>`
740722
if let Some(e) = self.next_start()? {
741-
let name = e.name().as_ref().to_vec();
742-
let map = map::MapAccess::new(self, e, fields)?;
723+
let map = map::MapAccess::new(self, e.clone(), fields)?;
743724
let value = visitor.visit_map(map)?;
744-
self.read_to_end(QName(&name))?;
725+
self.read_to_end(e.name())?;
745726
Ok(value)
746727
} else {
747728
Err(DeError::ExpectedStart)
@@ -1182,7 +1163,7 @@ mod tests {
11821163
// </skip>
11831164
// </root>
11841165
assert_eq!(de.next().unwrap(), Start(BytesStart::new("target")));
1185-
de.read_to_end(QName(b"target")).unwrap();
1166+
de.read_to_end(QName("target")).unwrap();
11861167
assert_eq!(de.read, vec![]);
11871168
assert_eq!(
11881169
de.write,
@@ -1219,7 +1200,7 @@ mod tests {
12191200
assert_eq!(de.write, vec![]);
12201201

12211202
assert_eq!(de.next().unwrap(), Start(BytesStart::new("skip")));
1222-
de.read_to_end(QName(b"skip")).unwrap();
1203+
de.read_to_end(QName("skip")).unwrap();
12231204

12241205
assert_eq!(de.next().unwrap(), End(BytesEnd::new("root")));
12251206
assert_eq!(de.next().unwrap(), Eof);
@@ -1477,7 +1458,7 @@ mod tests {
14771458
de.next().unwrap(),
14781459
Start(BytesStart::from_content(r#"tag a="1""#, 3))
14791460
);
1480-
assert_eq!(de.read_to_end(QName(b"tag")).unwrap(), ());
1461+
assert_eq!(de.read_to_end(QName("tag")).unwrap(), ());
14811462

14821463
assert_eq!(
14831464
de.next().unwrap(),
@@ -1487,7 +1468,7 @@ mod tests {
14871468
assert_eq!(de.next().unwrap(), End(BytesEnd::new("tag")));
14881469

14891470
assert_eq!(de.next().unwrap(), Start(BytesStart::new("self-closed")));
1490-
assert_eq!(de.read_to_end(QName(b"self-closed")).unwrap(), ());
1471+
assert_eq!(de.read_to_end(QName("self-closed")).unwrap(), ());
14911472

14921473
assert_eq!(de.next().unwrap(), End(BytesEnd::new("root")));
14931474
assert_eq!(de.next().unwrap(), Eof);
@@ -1588,7 +1569,7 @@ mod tests {
15881569
reader.next().unwrap(),
15891570
DeEvent::Start(BytesStart::from_content("item ", 4))
15901571
);
1591-
reader.read_to_end(QName(b"item")).unwrap();
1572+
reader.read_to_end(QName("item")).unwrap();
15921573
assert_eq!(reader.next().unwrap(), DeEvent::Eof);
15931574
}
15941575

src/de/seq.rs

+10-25
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,12 @@
11
use crate::de::{DeError, DeEvent, Deserializer, XmlRead};
2-
use crate::encoding::Decoder;
32
use crate::events::BytesStart;
43
use serde::de::{DeserializeSeed, SeqAccess};
54

6-
/// Check if tag `start` is included in the `fields` list. `decoder` is used to
7-
/// get a string representation of a tag.
5+
/// Check if tag `start` is included in the `fields` list.
86
///
97
/// Returns `true`, if `start` is not in the `fields` list and `false` otherwise.
10-
pub fn not_in(
11-
fields: &'static [&'static str],
12-
start: &BytesStart,
13-
decoder: Decoder,
14-
) -> Result<bool, DeError> {
15-
let tag = decoder.decode(start.name().into_inner())?;
16-
17-
Ok(fields.iter().all(|&field| field != tag.as_ref()))
8+
pub fn not_in(fields: &'static [&'static str], start: &BytesStart) -> Result<bool, DeError> {
9+
Ok(fields.iter().all(|&field| field != start.name().as_ref()))
1810
}
1911

2012
/// A filter that determines, what tags should form a sequence.
@@ -59,10 +51,10 @@ pub enum TagFilter<'de> {
5951
}
6052

6153
impl<'de> TagFilter<'de> {
62-
pub fn is_suitable(&self, start: &BytesStart, decoder: Decoder) -> Result<bool, DeError> {
54+
pub fn is_suitable(&self, start: &BytesStart) -> Result<bool, DeError> {
6355
match self {
6456
Self::Include(n) => Ok(n.name() == start.name()),
65-
Self::Exclude(fields) => not_in(fields, start, decoder),
57+
Self::Exclude(fields) => not_in(fields, start),
6658
}
6759
}
6860
}
@@ -132,18 +124,17 @@ where
132124
where
133125
T: DeserializeSeed<'de>,
134126
{
135-
let decoder = self.de.reader.decoder();
136127
loop {
137128
break match self.de.peek()? {
138129
// If we see a tag that we not interested, skip it
139130
#[cfg(feature = "overlapped-lists")]
140-
DeEvent::Start(e) if !self.filter.is_suitable(e, decoder)? => {
131+
DeEvent::Start(e) if !self.filter.is_suitable(e)? => {
141132
self.de.skip()?;
142133
continue;
143134
}
144135
// Stop iteration when list elements ends
145136
#[cfg(not(feature = "overlapped-lists"))]
146-
DeEvent::Start(e) if !self.filter.is_suitable(e, decoder)? => Ok(None),
137+
DeEvent::Start(e) if !self.filter.is_suitable(e)? => Ok(None),
147138
DeEvent::End(_) => Ok(None),
148139
DeEvent::Eof => Ok(None),
149140

@@ -158,13 +149,7 @@ where
158149
fn test_not_in() {
159150
let tag = BytesStart::new("tag");
160151

161-
assert_eq!(not_in(&[], &tag, Decoder::utf8()).unwrap(), true);
162-
assert_eq!(
163-
not_in(&["no", "such", "tags"], &tag, Decoder::utf8()).unwrap(),
164-
true
165-
);
166-
assert_eq!(
167-
not_in(&["some", "tag", "included"], &tag, Decoder::utf8()).unwrap(),
168-
false
169-
);
152+
assert_eq!(not_in(&[], &tag).unwrap(), true);
153+
assert_eq!(not_in(&["no", "such", "tags"], &tag).unwrap(), true);
154+
assert_eq!(not_in(&["some", "tag", "included"], &tag).unwrap(), false);
170155
}

0 commit comments

Comments
 (0)