1
1
//! Unblocking reader which supports waiting for strings/regexes and EOF to be present
2
2
3
3
use crate :: error:: Error ;
4
+ use crate :: encoding:: Encoding ;
4
5
pub use regex:: Regex ;
5
6
use std:: io:: prelude:: * ;
6
7
use std:: io:: { self , BufReader } ;
@@ -108,6 +109,7 @@ pub struct NBReader {
108
109
buffer : String ,
109
110
eof : bool ,
110
111
timeout : Option < time:: Duration > ,
112
+ encoding : Encoding ,
111
113
}
112
114
113
115
impl NBReader {
@@ -154,6 +156,7 @@ impl NBReader {
154
156
buffer : String :: with_capacity ( 1024 ) ,
155
157
eof : false ,
156
158
timeout : timeout. map ( time:: Duration :: from_millis) ,
159
+ encoding : Encoding :: UTF8 ,
157
160
}
158
161
}
159
162
@@ -162,21 +165,22 @@ impl NBReader {
162
165
if self . eof {
163
166
return Ok ( ( ) ) ;
164
167
}
165
- // FIXME: Temporary flag to demonstrate utf-8 capabilities
166
- let unicode = true ;
168
+ // NOTE: When UTF-8 mode is on, there is no handling to salvage a
169
+ // stream of chars if a broken unicode char is not completed.
167
170
let mut char_buf: Vec < u8 > = Vec :: new ( ) ;
168
171
169
172
while let Ok ( from_channel) = self . reader . try_recv ( ) {
170
173
match from_channel {
171
174
Ok ( PipedChar :: Char ( c) ) => {
172
- if unicode {
173
- char_buf. push ( c) ;
174
- if let Ok ( s) = std:: str:: from_utf8 ( & char_buf) {
175
- self . buffer . push ( s. chars ( ) . next ( ) . unwrap ( ) ) ;
176
- char_buf. clear ( ) ;
175
+ match & self . encoding {
176
+ Encoding :: ASCII => self . buffer . push ( c as char ) ,
177
+ Encoding :: UTF8 => {
178
+ char_buf. push ( c) ;
179
+ if let Ok ( s) = std:: str:: from_utf8 ( & char_buf) {
180
+ self . buffer . push ( s. chars ( ) . next ( ) . unwrap ( ) ) ;
181
+ char_buf. clear ( ) ;
182
+ }
177
183
}
178
- } else {
179
- self . buffer . push ( c as char )
180
184
}
181
185
} ,
182
186
Ok ( PipedChar :: EOF ) => self . eof = true ,
0 commit comments