Skip to content

Commit e6c6716

Browse files
committed
temp
1 parent ad57bc2 commit e6c6716

File tree

5 files changed

+72
-16
lines changed

5 files changed

+72
-16
lines changed

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ license = "MIT"
1414
[dependencies]
1515
document-features = { version = "0.2", optional = true }
1616
encoding_rs = { version = "0.8", optional = true }
17+
encoding_rs_io = { version = "0.1", optional = true }
1718
serde = { version = "1.0", optional = true }
1819
memchr = "2.5"
1920

@@ -47,7 +48,7 @@ default = []
4748
## crate, that satisfied the restriction above.
4849
##
4950
## [standard compliant]: https://www.w3.org/TR/xml11/#charencoding
50-
encoding = ["encoding_rs"]
51+
encoding = ["encoding_rs", "encoding_rs_io"]
5152

5253
## This feature enables support for deserializing lists where tags are overlapped
5354
## with tags that do not correspond to the list.

src/reader/buffered_reader.rs

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,17 @@ use std::io::{self, BufRead, BufReader};
66
use std::path::Path;
77

88
use memchr;
9+
#[cfg(feature = "encoding")]
10+
use encoding_rs::UTF_8;
11+
#[cfg(feature = "encoding")]
12+
use encoding_rs_io::{DecodeReaderBytes, DecodeReaderBytesBuilder};
913

1014
use crate::errors::{Error, Result};
1115
use crate::events::Event;
1216
use crate::name::QName;
13-
use crate::reader::{is_whitespace, BangType, ReadElementState, Reader, XmlSource};
17+
#[cfg(feature = "encoding")]
18+
use crate::reader::EncodingRef;
19+
use crate::reader::{is_whitespace, BangType, ReadElementState, Reader, TagState, XmlSource};
1420

1521
/// This is an implementation of [`Reader`] for reading from a [`BufRead`] as
1622
/// underlying byte stream.
@@ -217,12 +223,53 @@ impl<R: BufRead> Reader<R> {
217223
}
218224
}
219225

226+
#[cfg(feature = "encoding")]
227+
impl Reader<BufReader<DecodeReaderBytes<File, Vec<u8>>>> {
228+
/// Creates an XML reader from a file path.
229+
pub fn from_file<P: AsRef<Path>>(path: P) -> Result<Self> {
230+
let file = File::open(path).map_err(Error::Io)?;
231+
let decoder = DecodeReaderBytesBuilder::new()
232+
.encoding(Some(UTF_8))
233+
.bom_override(true)
234+
.build(file);
235+
236+
let reader = Self {
237+
reader: BufReader::new(decoder),
238+
opened_buffer: Vec::new(),
239+
opened_starts: Vec::new(),
240+
tag_state: TagState::Init,
241+
expand_empty_elements: false,
242+
trim_text_start: false,
243+
trim_text_end: false,
244+
trim_markup_names_in_closing_tags: true,
245+
check_end_names: true,
246+
buf_position: 0,
247+
check_comments: false,
248+
encoding: EncodingRef::Implicit(UTF_8),
249+
};
250+
Ok(reader)
251+
}
252+
}
253+
254+
#[cfg(not(feature = "encoding"))]
220255
impl Reader<BufReader<File>> {
221256
/// Creates an XML reader from a file path.
222257
pub fn from_file<P: AsRef<Path>>(path: P) -> Result<Self> {
223258
let file = File::open(path).map_err(Error::Io)?;
224-
let reader = BufReader::new(file);
225-
Ok(Self::from_reader(reader))
259+
let reader = Self {
260+
reader: BufReader::new(file),
261+
opened_buffer: Vec::new(),
262+
opened_starts: Vec::new(),
263+
tag_state: TagState::Init,
264+
expand_empty_elements: false,
265+
trim_text_start: false,
266+
trim_text_end: false,
267+
trim_markup_names_in_closing_tags: true,
268+
check_end_names: true,
269+
buf_position: 0,
270+
check_comments: false,
271+
};
272+
Ok(reader)
226273
}
227274
}
228275

src/reader/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//! A module to handle `Reader`
22
3+
use std::io::Read;
34
use std::str::from_utf8;
45

56
#[cfg(feature = "encoding")]
@@ -330,7 +331,7 @@ pub struct Reader<R> {
330331
}
331332

332333
/// Builder methods
333-
impl<R> Reader<R> {
334+
impl<R: Read> Reader<R> {
334335
/// Creates a `Reader` that reads from a given reader.
335336
pub fn from_reader(reader: R) -> Self {
336337
Self {

src/reader/ns_reader.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
//! [expanded names]: https://www.w3.org/TR/xml-names11/#dt-expname
66
77
use std::fs::File;
8-
use std::io::{BufRead, BufReader};
8+
use std::io::{BufRead, BufReader, Read};
99
use std::ops::Deref;
1010
use std::path::Path;
1111

@@ -32,7 +32,7 @@ pub struct NsReader<R> {
3232
}
3333

3434
/// Builder methods
35-
impl<R> NsReader<R> {
35+
impl<R: Read> NsReader<R> {
3636
/// Creates a `NsReader` that reads from a reader.
3737
#[inline]
3838
pub fn from_reader(reader: R) -> Self {

src/reader/slice_reader.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use encoding_rs::UTF_8;
1010
use crate::errors::{Error, Result};
1111
use crate::events::Event;
1212
use crate::name::QName;
13-
use crate::reader::{is_whitespace, BangType, ReadElementState, Reader, XmlSource};
13+
use crate::reader::{is_whitespace, BangType, ReadElementState, Reader, TagState, XmlSource};
1414

1515
use memchr;
1616

@@ -21,15 +21,22 @@ impl<'a> Reader<&'a [u8]> {
2121
/// Creates an XML reader from a string slice.
2222
pub fn from_str(s: &'a str) -> Self {
2323
// Rust strings are guaranteed to be UTF-8, so lock the encoding
24-
#[cfg(feature = "encoding")]
25-
{
26-
let mut reader = Self::from_reader(s.as_bytes());
27-
reader.encoding = EncodingRef::Explicit(UTF_8);
28-
reader
29-
}
24+
Self {
25+
reader: s.as_bytes(),
26+
opened_buffer: Vec::new(),
27+
opened_starts: Vec::new(),
28+
tag_state: TagState::Init,
29+
expand_empty_elements: false,
30+
trim_text_start: false,
31+
trim_text_end: false,
32+
trim_markup_names_in_closing_tags: true,
33+
check_end_names: true,
34+
buf_position: 0,
35+
check_comments: false,
3036

31-
#[cfg(not(feature = "encoding"))]
32-
Self::from_reader(s.as_bytes())
37+
#[cfg(feature = "encoding")]
38+
encoding: EncodingRef::Explicit(UTF_8),
39+
}
3340
}
3441

3542
/// Read an event that borrows from the input rather than a buffer.

0 commit comments

Comments
 (0)