@@ -6,11 +6,17 @@ use std::io::{self, BufRead, BufReader};
66use std:: path:: Path ;
77
88use memchr;
9+ #[ cfg( feature = "encoding" ) ]
10+ use encoding_rs:: UTF_8 ;
11+ #[ cfg( feature = "encoding" ) ]
12+ use encoding_rs_io:: { DecodeReaderBytes , DecodeReaderBytesBuilder } ;
913
1014use crate :: errors:: { Error , Result } ;
1115use crate :: events:: Event ;
1216use 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" ) ) ]
220255impl 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
0 commit comments