Skip to content

Commit 72f6a41

Browse files
committed
Remove the ability to use SliceReader with raw bytes.
In the near future, decoding will be performed automatically as the input is read. If the input has an unknown encoding, it must be decoded first, necessitating a buffer. Therefore only the buffered implementation can be used for `Reader::from_bytes()` If the encoding of the bytes is known up-front, you can decode them up-front and subsequently use `Reader::from_str()` if desired.
1 parent 559d0e8 commit 72f6a41

File tree

8 files changed

+81
-76
lines changed

8 files changed

+81
-76
lines changed

Changelog.md

+6-1
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,12 @@
138138
- [#423]: Removed `BytesText::from_plain` because it internally did escaping of a byte array,
139139
but since now escaping works on strings. Use `BytesText::from_plain_str` instead
140140
- [#425]: Split the internal implementation of `Reader` into multiple files to better separate the
141-
buffered and unbuffered implementations. The buffered methods, e.g. `read_event_into(&mut buf)`,
141+
buffered and unbuffered implementations. The unbuffered methods, e.g. `read_event()`,
142142
will no longer be available when reading from a slice.
143+
- [#430]: When using `Reader` with raw bytes, a buffered parsing implementation will always be used.
144+
If using `Reader::from_str()`, the reader will borrow directly from the `&str`. If you have a byte
145+
array known to be valid UTF-8, it is recommended to convert it to `&str` first, which will enable
146+
the unbuffered (borrowing) implementation.
143147

144148
### New Tests
145149

@@ -171,6 +175,7 @@
171175
[#421]: https://github.com/tafia/quick-xml/pull/421
172176
[#423]: https://github.com/tafia/quick-xml/pull/423
173177
[#425]: https://github.com/tafia/quick-xml/pull/425
178+
[#430]: https://github.com/tafia/quick-xml/pull/430
174179

175180
## 0.23.0 -- 2022-05-08
176181

src/events/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -983,8 +983,9 @@ pub enum Event<'a> {
983983
/// let xml = b"\xEF\xBB\xBF<?xml version='1.0'?>";
984984
/// let mut reader = Reader::from_bytes(xml);
985985
/// let mut events_processed = 0;
986+
/// let mut event_buffer = Vec::new();
986987
/// loop {
987-
/// match reader.read_event() {
988+
/// match reader.read_event_into(&mut event_buffer) {
988989
/// Ok(Event::StartText(e)) => {
989990
/// assert_eq!(events_processed, 0);
990991
/// // Content contains BOM

src/reader/buffered_reader.rs

+12-4
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,14 @@ impl Reader<BufferedReader<BufReader<File>>> {
406406
}
407407
}
408408

409+
/// Builder for reading from any [`&[u8]`].
410+
impl<'buf> Reader<BufferedReader<&'buf [u8]>> {
411+
/// Creates an XML reader from any type implementing [`BufRead`].
412+
pub fn from_bytes(s: &'buf [u8]) -> Self {
413+
Self::from_reader_internal(BufferedReader(s))
414+
}
415+
}
416+
409417
/// Builder for reading from any [`BufRead`].
410418
impl<R: BufRead> Reader<BufferedReader<R>> {
411419
/// Creates an XML reader from any type implementing [`BufRead`].
@@ -652,17 +660,17 @@ mod test {
652660
use super::*;
653661
use crate::reader::test::check;
654662

655-
fn input_from_bytes(bytes: &[u8]) -> BufferedReader<&[u8]> {
656-
BufferedReader(bytes)
663+
fn input_from_str(s: &str) -> BufferedReader<&[u8]> {
664+
BufferedReader(s.as_bytes())
657665
}
658666

659667
fn reader_from_str(s: &str) -> Reader<BufferedReader<&[u8]>> {
660668
Reader::from_reader_internal(BufferedReader(s.as_bytes()))
661669
}
662670

663671
#[allow(dead_code)]
664-
fn reader_from_bytes(s: &[u8]) -> Reader<BufferedReader<&[u8]>> {
665-
Reader::from_reader_internal(BufferedReader(s))
672+
fn reader_from_bytes(bytes: &[u8]) -> Reader<BufferedReader<&[u8]>> {
673+
Reader::from_reader_internal(BufferedReader(bytes))
666674
}
667675

668676
check!(let mut buf = Vec::new(););

src/reader/mod.rs

+45-45
Large diffs are not rendered by default.

src/reader/slice_reader.rs

+2-12
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,6 @@ impl<'buf> Reader<SliceReader<'buf>> {
132132

133133
reader
134134
}
135-
136-
/// Creates an XML reader from a slice of bytes.
137-
pub fn from_bytes(s: &'buf [u8]) -> Self {
138-
Self::from_reader_internal(SliceReader(s))
139-
}
140135
}
141136

142137
/// Public reading methods for a [`Reader`] based on an [`SliceReader`].
@@ -473,18 +468,13 @@ mod test {
473468
use super::*;
474469
use crate::reader::test::check;
475470

476-
fn input_from_bytes<'buf>(bytes: &'buf [u8]) -> SliceReader<'buf> {
477-
SliceReader(bytes)
471+
fn input_from_str<'buf>(s: &'buf str) -> SliceReader<'buf> {
472+
SliceReader(s.as_bytes())
478473
}
479474

480475
fn reader_from_str<'buf>(s: &'buf str) -> Reader<SliceReader<'buf>> {
481476
Reader::from_str(s)
482477
}
483478

484-
#[allow(dead_code)]
485-
fn reader_from_bytes<'buf>(s: &'buf [u8]) -> Reader<SliceReader<'buf>> {
486-
Reader::from_bytes(s)
487-
}
488-
489479
check!();
490480
}

tests/namespaces.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,9 @@ fn default_namespace_reset() {
138138
/// The code path for namespace handling is slightly different for `Empty` vs. `Start+End`.
139139
#[test]
140140
fn attributes_empty_ns() {
141-
let src = b"<a att1='a' r:att2='b' xmlns:r='urn:example:r' />";
141+
let src = "<a att1='a' r:att2='b' xmlns:r='urn:example:r' />";
142142

143-
let mut r = Reader::from_bytes(src);
143+
let mut r = Reader::from_str(src);
144144
r.trim_text(true).expand_empty_elements(false);
145145
let mut ns_buf = Vec::new();
146146

@@ -178,9 +178,9 @@ fn attributes_empty_ns() {
178178
/// The code path for namespace handling is slightly different for `Empty` vs. `Start+End`.
179179
#[test]
180180
fn attributes_empty_ns_expanded() {
181-
let src = b"<a att1='a' r:att2='b' xmlns:r='urn:example:r' />";
181+
let src = "<a att1='a' r:att2='b' xmlns:r='urn:example:r' />";
182182

183-
let mut r = Reader::from_bytes(src);
183+
let mut r = Reader::from_str(src);
184184
r.trim_text(true).expand_empty_elements(true);
185185
let mut ns_buf = Vec::new();
186186
{
@@ -221,9 +221,9 @@ fn attributes_empty_ns_expanded() {
221221

222222
#[test]
223223
fn default_ns_shadowing_empty() {
224-
let src = b"<e xmlns='urn:example:o'><e att1='a' xmlns='urn:example:i' /></e>";
224+
let src = "<e xmlns='urn:example:o'><e att1='a' xmlns='urn:example:i' /></e>";
225225

226-
let mut r = Reader::from_bytes(src);
226+
let mut r = Reader::from_str(src);
227227
r.trim_text(true).expand_empty_elements(false);
228228
let mut ns_buf = Vec::new();
229229

@@ -279,9 +279,9 @@ fn default_ns_shadowing_empty() {
279279

280280
#[test]
281281
fn default_ns_shadowing_expanded() {
282-
let src = b"<e xmlns='urn:example:o'><e att1='a' xmlns='urn:example:i' /></e>";
282+
let src = "<e xmlns='urn:example:o'><e att1='a' xmlns='urn:example:i' /></e>";
283283

284-
let mut r = Reader::from_bytes(src);
284+
let mut r = Reader::from_str(src);
285285
r.trim_text(true).expand_empty_elements(true);
286286
let mut ns_buf = Vec::new();
287287

tests/test.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use pretty_assertions::assert_eq;
99

1010
#[test]
1111
fn test_sample() {
12-
let src: &[u8] = include_bytes!("documents/sample_rss.xml");
13-
let mut r = Reader::from_bytes(src);
12+
let src: &str = include_str!("documents/sample_rss.xml");
13+
let mut r = Reader::from_str(src);
1414
let mut count = 0;
1515
loop {
1616
match r.read_event().unwrap() {
@@ -25,8 +25,8 @@ fn test_sample() {
2525

2626
#[test]
2727
fn test_attributes_empty() {
28-
let src = b"<a att1='a' att2='b'/>";
29-
let mut r = Reader::from_bytes(src);
28+
let src = "<a att1='a' att2='b'/>";
29+
let mut r = Reader::from_str(src);
3030
r.trim_text(true).expand_empty_elements(false);
3131
match r.read_event() {
3232
Ok(Empty(e)) => {

tests/xmlrs_reader_tests.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -369,10 +369,11 @@ fn test_bytes(input: &[u8], output: &[u8], trim: bool) {
369369
.expand_empty_elements(false);
370370

371371
let mut spec_lines = SpecIter(output).enumerate();
372+
let mut event_buffer = Vec::new();
372373
let mut ns_buffer = Vec::new();
373374

374375
loop {
375-
let event = reader.read_namespaced_event(&mut ns_buffer);
376+
let event = reader.read_namespaced_event_into(&mut event_buffer, &mut ns_buffer);
376377
let line = xmlrs_display(event, reader.decoder());
377378
if let Some((n, spec)) = spec_lines.next() {
378379
if spec.trim() == "EndDocument" {

0 commit comments

Comments
 (0)