@@ -8,13 +8,13 @@ use std::path::Path;
8
8
use crate :: errors:: { Error , Result } ;
9
9
use crate :: events:: Event ;
10
10
use crate :: name:: QName ;
11
- use crate :: reader:: { is_whitespace, BangType , Parser , Reader , Span , XmlSource } ;
11
+ use crate :: reader:: { is_whitespace, BangType , Parser , ReadTextResult , Reader , Span , XmlSource } ;
12
12
13
13
macro_rules! impl_buffered_source {
14
14
( $( $lf: lifetime, $reader: tt, $async: ident, $await: ident) ?) => {
15
15
#[ cfg( not( feature = "encoding" ) ) ]
16
16
#[ inline]
17
- $( $async) ? fn remove_utf8_bom( & mut self ) -> Result <( ) > {
17
+ $( $async) ? fn remove_utf8_bom( & mut self ) -> io :: Result <( ) > {
18
18
use crate :: encoding:: UTF8_BOM ;
19
19
20
20
loop {
@@ -26,14 +26,14 @@ macro_rules! impl_buffered_source {
26
26
Ok ( ( ) )
27
27
} ,
28
28
Err ( ref e) if e. kind( ) == io:: ErrorKind :: Interrupted => continue ,
29
- Err ( e) => Err ( Error :: Io ( e . into ( ) ) ) ,
29
+ Err ( e) => Err ( e ) ,
30
30
} ;
31
31
}
32
32
}
33
33
34
34
#[ cfg( feature = "encoding" ) ]
35
35
#[ inline]
36
- $( $async) ? fn detect_encoding( & mut self ) -> Result <Option <& ' static encoding_rs:: Encoding >> {
36
+ $( $async) ? fn detect_encoding( & mut self ) -> io :: Result <Option <& ' static encoding_rs:: Encoding >> {
37
37
loop {
38
38
break match self $( . $reader) ? . fill_buf( ) $( . $await) ? {
39
39
Ok ( n) => if let Some ( ( enc, bom_len) ) = crate :: encoding:: detect_encoding( n) {
@@ -43,54 +43,106 @@ macro_rules! impl_buffered_source {
43
43
Ok ( None )
44
44
} ,
45
45
Err ( ref e) if e. kind( ) == io:: ErrorKind :: Interrupted => continue ,
46
- Err ( e) => Err ( Error :: Io ( e . into ( ) ) ) ,
46
+ Err ( e) => Err ( e ) ,
47
47
} ;
48
48
}
49
49
}
50
50
51
+ #[ inline]
52
+ $( $async) ? fn read_text $( <$lf>) ? (
53
+ & mut self ,
54
+ buf: & ' b mut Vec <u8 >,
55
+ position: & mut usize ,
56
+ ) -> ReadTextResult <' b, & ' b mut Vec <u8 >> {
57
+ let mut read = 0 ;
58
+ let start = buf. len( ) ;
59
+ loop {
60
+ let available = match self $( . $reader) ? . fill_buf( ) $( . $await) ? {
61
+ Ok ( n) if n. is_empty( ) => break ,
62
+ Ok ( n) => n,
63
+ Err ( ref e) if e. kind( ) == io:: ErrorKind :: Interrupted => continue ,
64
+ Err ( e) => {
65
+ * position += read;
66
+ return ReadTextResult :: Err ( e) ;
67
+ }
68
+ } ;
69
+
70
+ match memchr:: memchr( b'<' , available) {
71
+ Some ( 0 ) => {
72
+ self $( . $reader) ? . consume( 1 ) ;
73
+ * position += 1 ;
74
+ return ReadTextResult :: Markup ( buf) ;
75
+ }
76
+ Some ( i) => {
77
+ buf. extend_from_slice( & available[ ..i] ) ;
78
+
79
+ let used = i + 1 ;
80
+ self $( . $reader) ? . consume( used) ;
81
+ read += used;
82
+
83
+ * position += read;
84
+ return ReadTextResult :: UpToMarkup ( & buf[ start..] ) ;
85
+ }
86
+ None => {
87
+ buf. extend_from_slice( available) ;
88
+
89
+ let used = available. len( ) ;
90
+ self $( . $reader) ? . consume( used) ;
91
+ read += used;
92
+ }
93
+ }
94
+ }
95
+
96
+ * position += read;
97
+ ReadTextResult :: UpToEof ( & buf[ start..] )
98
+ }
99
+
51
100
#[ inline]
52
101
$( $async) ? fn read_bytes_until $( <$lf>) ? (
53
102
& mut self ,
54
103
byte: u8 ,
55
104
buf: & ' b mut Vec <u8 >,
56
105
position: & mut usize ,
57
- ) -> Result <( & ' b [ u8 ] , bool ) > {
106
+ ) -> io :: Result <( & ' b [ u8 ] , bool ) > {
58
107
// search byte must be within the ascii range
59
108
debug_assert!( byte. is_ascii( ) ) ;
60
109
61
110
let mut read = 0 ;
62
- let mut done = false ;
63
111
let start = buf. len( ) ;
64
- while !done {
65
- let used = {
66
- let available = match self $( . $reader) ? . fill_buf( ) $( . $await) ? {
67
- Ok ( n) if n. is_empty( ) => break ,
68
- Ok ( n) => n,
69
- Err ( ref e) if e. kind( ) == io:: ErrorKind :: Interrupted => continue ,
70
- Err ( e) => {
71
- * position += read;
72
- return Err ( Error :: Io ( e. into( ) ) ) ;
73
- }
74
- } ;
75
-
76
- match memchr:: memchr( byte, available) {
77
- Some ( i) => {
78
- buf. extend_from_slice( & available[ ..i] ) ;
79
- done = true ;
80
- i + 1
81
- }
82
- None => {
83
- buf. extend_from_slice( available) ;
84
- available. len( )
85
- }
112
+ loop {
113
+ let available = match self $( . $reader) ? . fill_buf( ) $( . $await) ? {
114
+ Ok ( n) if n. is_empty( ) => break ,
115
+ Ok ( n) => n,
116
+ Err ( ref e) if e. kind( ) == io:: ErrorKind :: Interrupted => continue ,
117
+ Err ( e) => {
118
+ * position += read;
119
+ return Err ( e) ;
86
120
}
87
121
} ;
88
- self $( . $reader) ? . consume( used) ;
89
- read += used;
122
+
123
+ match memchr:: memchr( byte, available) {
124
+ Some ( i) => {
125
+ buf. extend_from_slice( & available[ ..i] ) ;
126
+
127
+ let used = i + 1 ;
128
+ self $( . $reader) ? . consume( used) ;
129
+ read += used;
130
+
131
+ * position += read;
132
+ return Ok ( ( & buf[ start..] , true ) ) ;
133
+ }
134
+ None => {
135
+ buf. extend_from_slice( available) ;
136
+
137
+ let used = available. len( ) ;
138
+ self $( . $reader) ? . consume( used) ;
139
+ read += used;
140
+ }
141
+ }
90
142
}
91
- * position += read;
92
143
93
- Ok ( ( & buf[ start..] , done) )
144
+ * position += read;
145
+ Ok ( ( & buf[ start..] , false ) )
94
146
}
95
147
96
148
#[ inline]
@@ -188,7 +240,7 @@ macro_rules! impl_buffered_source {
188
240
}
189
241
190
242
#[ inline]
191
- $( $async) ? fn skip_whitespace( & mut self , position: & mut usize ) -> Result <( ) > {
243
+ $( $async) ? fn skip_whitespace( & mut self , position: & mut usize ) -> io :: Result <( ) > {
192
244
loop {
193
245
break match self $( . $reader) ? . fill_buf( ) $( . $await) ? {
194
246
Ok ( n) => {
@@ -202,32 +254,18 @@ macro_rules! impl_buffered_source {
202
254
}
203
255
}
204
256
Err ( ref e) if e. kind( ) == io:: ErrorKind :: Interrupted => continue ,
205
- Err ( e) => Err ( Error :: Io ( e . into ( ) ) ) ,
257
+ Err ( e) => Err ( e ) ,
206
258
} ;
207
259
}
208
260
}
209
261
210
262
#[ inline]
211
- $( $async) ? fn skip_one( & mut self , byte: u8 ) -> Result <bool > {
212
- // search byte must be within the ascii range
213
- debug_assert!( byte. is_ascii( ) ) ;
214
-
215
- match self . peek_one( ) $( . $await) ? ? {
216
- Some ( b) if b == byte => {
217
- self $( . $reader) ? . consume( 1 ) ;
218
- Ok ( true )
219
- }
220
- _ => Ok ( false ) ,
221
- }
222
- }
223
-
224
- #[ inline]
225
- $( $async) ? fn peek_one( & mut self ) -> Result <Option <u8 >> {
263
+ $( $async) ? fn peek_one( & mut self ) -> io:: Result <Option <u8 >> {
226
264
loop {
227
265
break match self $( . $reader) ? . fill_buf( ) $( . $await) ? {
228
266
Ok ( n) => Ok ( n. first( ) . cloned( ) ) ,
229
267
Err ( ref e) if e. kind( ) == io:: ErrorKind :: Interrupted => continue ,
230
- Err ( e) => Err ( Error :: Io ( e . into ( ) ) ) ,
268
+ Err ( e) => Err ( e ) ,
231
269
} ;
232
270
}
233
271
}
0 commit comments