@@ -10,24 +10,33 @@ use Error;
10
10
/// Parses ITM packets.
11
11
pub struct Decoder < R : Read > {
12
12
inner : R ,
13
- follow : bool
13
+ follow : bool ,
14
14
}
15
15
16
16
// Copy&Paste from std::io::Read::read_exact
17
- fn read_exact_gently < R : Read > ( reader : & mut R , mut buf : & mut [ u8 ] , keep_reading : bool ) -> :: std:: io:: Result < ( ) > {
18
- use std:: io:: { ErrorKind , Error } ;
17
+ fn read_exact_gently < R : Read > (
18
+ reader : & mut R ,
19
+ mut buf : & mut [ u8 ] ,
20
+ keep_reading : bool ,
21
+ ) -> :: std:: io:: Result < ( ) > {
22
+ use std:: io:: { Error , ErrorKind } ;
19
23
while !buf. is_empty ( ) {
20
24
match reader. read ( buf) {
21
25
Ok ( 0 ) if !keep_reading => break ,
22
26
Ok ( 0 ) if keep_reading => continue ,
23
- Ok ( n) => { let tmp = buf; buf = & mut tmp[ n..] ; }
27
+ Ok ( n) => {
28
+ let tmp = buf;
29
+ buf = & mut tmp[ n..] ;
30
+ }
24
31
Err ( ref e) if e. kind ( ) == ErrorKind :: Interrupted => { }
25
32
Err ( e) => return Err ( e) ,
26
33
}
27
34
}
28
35
if !buf. is_empty ( ) {
29
- Err ( Error :: new ( ErrorKind :: UnexpectedEof ,
30
- "failed to fill whole buffer" ) )
36
+ Err ( Error :: new (
37
+ ErrorKind :: UnexpectedEof ,
38
+ "failed to fill whole buffer" ,
39
+ ) )
31
40
} else {
32
41
Ok ( ( ) )
33
42
}
@@ -37,7 +46,10 @@ impl<R: Read> Decoder<R> {
37
46
/// Construct a new `Decoder` that reads encoded packets from
38
47
/// `inner`.
39
48
pub fn new ( inner : R , follow : bool ) -> Decoder < R > {
40
- Decoder :: < R > { inner : inner, follow : follow}
49
+ Decoder :: < R > {
50
+ inner : inner,
51
+ follow : follow,
52
+ }
41
53
}
42
54
43
55
// TODO: If we need config for the Decoder, my plan is to:
@@ -105,8 +117,11 @@ pub fn from_slice(s: &[u8]) -> Result<Packet, failure::Error> {
105
117
#[ cfg( test) ]
106
118
mod tests {
107
119
use super :: from_slice;
108
- use error:: { Error , ErrorKind , Result } ;
120
+
121
+ use failure;
122
+
109
123
use packet:: { Kind , Packet } ;
124
+ use Error ;
110
125
111
126
#[ test]
112
127
fn header ( ) {
@@ -168,36 +183,45 @@ mod tests {
168
183
169
184
#[ test]
170
185
fn unknown_header ( ) {
171
- let p = try_decode_one ( & [ 0x00 ] ) ;
172
- match p {
173
- Err ( Error ( ErrorKind :: UnknownHeader ( 0x00 ) , _) ) => ( ) ,
174
- _ => panic ! ( ) ,
186
+ if let Err ( e) = try_decode_one ( & [ 0x00 ] ) {
187
+ match e. downcast_ref :: < Error > ( ) {
188
+ Some ( Error :: UnknownHeader { byte : 0 } ) => return ( ) ,
189
+ _ => { }
190
+ }
175
191
}
192
+
193
+ panic ! ( )
176
194
}
177
195
178
196
#[ test]
179
197
fn eof_before_payload ( ) {
180
- let p = try_decode_one ( & [ 0x01 /* Missing payload bytes */ ] ) ;
181
- match p {
182
- Err ( Error ( ErrorKind :: EofDuringPacket , _) ) => ( ) ,
183
- _ => panic ! ( ) ,
198
+ if let Err ( e) = try_decode_one ( & [ 0x01 /* Missing payload bytes */ ] ) {
199
+ match e. downcast_ref :: < Error > ( ) {
200
+ Some ( Error :: EofDuringPacket ) => return ( ) ,
201
+ _ => { }
202
+ }
184
203
}
204
+
205
+ panic ! ( )
185
206
}
186
207
187
208
#[ test]
188
209
fn eof_before_packet ( ) {
189
- let p = try_decode_one ( & [ /* Missing packet bytes */ ] ) ;
190
- match p {
191
- Err ( Error ( ErrorKind :: EofBeforePacket , _) ) => ( ) ,
192
- _ => panic ! ( ) ,
210
+ if let Err ( e) = try_decode_one ( & [ /* Missing packet bytes */ ] ) {
211
+ match e. downcast_ref :: < Error > ( ) {
212
+ Some ( Error :: EofBeforePacket ) => return ( ) ,
213
+ _ => { }
214
+ }
193
215
}
216
+
217
+ panic ! ( )
194
218
}
195
219
196
220
fn decode_one ( data : & [ u8 ] ) -> Packet {
197
221
try_decode_one ( data) . unwrap ( )
198
222
}
199
223
200
- fn try_decode_one ( data : & [ u8 ] ) -> Result < Packet > {
224
+ fn try_decode_one ( data : & [ u8 ] ) -> Result < Packet , failure :: Error > {
201
225
let p = from_slice ( data) ;
202
226
println ! ( "{:#?}" , p) ;
203
227
p
0 commit comments