22
22
//! Encoder
23
23
24
24
use std:: io:: { self , Write } ;
25
- use std:: convert:: From ;
26
- use std:: mem;
25
+ use std:: { mem, error, fmt} ;
27
26
28
27
use byteorder:: { self , LittleEndian , WriteBytesExt } ;
29
28
use chrono:: { DateTime , UTC } ;
30
29
31
30
use spec:: { ElementType , BinarySubtype } ;
32
- use bson;
31
+ use bson:: { Array , Document , Bson } ;
33
32
34
33
#[ derive( Debug ) ]
35
34
pub enum EncoderError {
@@ -48,6 +47,27 @@ impl From<byteorder::Error> for EncoderError {
48
47
}
49
48
}
50
49
50
+ impl fmt:: Display for EncoderError {
51
+ fn fmt ( & self , fmt : & mut fmt:: Formatter ) -> fmt:: Result {
52
+ match self {
53
+ & EncoderError :: IoError ( ref inner) => inner. fmt ( fmt)
54
+ }
55
+ }
56
+ }
57
+
58
+ impl error:: Error for EncoderError {
59
+ fn description ( & self ) -> & str {
60
+ match self {
61
+ & EncoderError :: IoError ( ref inner) => inner. description ( ) ,
62
+ }
63
+ }
64
+ fn cause ( & self ) -> Option < & error:: Error > {
65
+ match self {
66
+ & EncoderError :: IoError ( ref inner) => Some ( inner)
67
+ }
68
+ }
69
+ }
70
+
51
71
pub type EncoderResult < T > = Result < T , EncoderError > ;
52
72
53
73
pub struct Encoder < ' a > {
@@ -159,7 +179,7 @@ impl<'a> Encoder<'a> {
159
179
Ok ( ( ) )
160
180
}
161
181
162
- pub fn encode_javascript_code_with_scope ( & mut self , key : & str , code : & str , scope : & bson :: Document )
182
+ pub fn encode_javascript_code_with_scope ( & mut self , key : & str , code : & str , scope : & Document )
163
183
-> Result < ( ) , EncoderError > {
164
184
try!( self . writer . write_u8 ( ElementType :: JavaScriptCodeWithScope as u8 ) ) ;
165
185
try!( self . write_cstring ( key) ) ;
@@ -213,21 +233,21 @@ impl<'a> Encoder<'a> {
213
233
Ok ( ( ) )
214
234
}
215
235
216
- pub fn encode_embedded_document ( & mut self , key : & str , doc : & bson :: Document ) -> Result < ( ) , EncoderError > {
236
+ pub fn encode_embedded_document ( & mut self , key : & str , doc : & Document ) -> Result < ( ) , EncoderError > {
217
237
try!( self . writer . write_u8 ( ElementType :: EmbeddedDocument as u8 ) ) ;
218
238
try!( self . write_cstring ( key) ) ;
219
239
220
240
self . encode_document ( doc)
221
241
}
222
242
223
- pub fn encode_embedded_array ( & mut self , key : & str , arr : & bson :: Array ) -> Result < ( ) , EncoderError > {
243
+ pub fn encode_embedded_array ( & mut self , key : & str , arr : & Array ) -> Result < ( ) , EncoderError > {
224
244
try!( self . writer . write_u8 ( ElementType :: Array as u8 ) ) ;
225
245
try!( self . write_cstring ( key) ) ;
226
246
227
247
self . encode_array ( arr)
228
248
}
229
249
230
- pub fn encode_document ( & mut self , doc : & bson :: Document ) -> Result < ( ) , EncoderError > {
250
+ pub fn encode_document ( & mut self , doc : & Document ) -> Result < ( ) , EncoderError > {
231
251
let mut buf = Vec :: new ( ) ;
232
252
233
253
{
@@ -244,13 +264,13 @@ impl<'a> Encoder<'a> {
244
264
Ok ( ( ) )
245
265
}
246
266
247
- pub fn encode_array ( & mut self , arr : & bson :: Array ) -> Result < ( ) , EncoderError > {
267
+ pub fn encode_array ( & mut self , arr : & Array ) -> Result < ( ) , EncoderError > {
248
268
let mut buf = Vec :: new ( ) ;
249
269
250
270
{
251
271
let mut enc = Encoder :: new ( & mut buf) ;
252
272
for ( key, val) in arr. iter ( ) . enumerate ( ) {
253
- try!( enc. encode_bson ( & key. to_string ( ) [ .. ] , val) ) ;
273
+ try!( enc. encode_bson ( & key. to_string ( ) , val) ) ;
254
274
}
255
275
}
256
276
@@ -261,9 +281,7 @@ impl<'a> Encoder<'a> {
261
281
Ok ( ( ) )
262
282
}
263
283
264
- fn encode_bson ( & mut self , key : & str , val : & bson:: Bson ) -> Result < ( ) , EncoderError > {
265
- use bson:: Bson ;
266
-
284
+ fn encode_bson ( & mut self , key : & str , val : & Bson ) -> Result < ( ) , EncoderError > {
267
285
match val {
268
286
& Bson :: FloatingPoint ( v) => self . encode_floating_point ( & key[ ..] , v) ,
269
287
& Bson :: String ( ref v) => self . encode_utf8_string ( & key[ ..] , & v[ ..] ) ,
@@ -289,7 +307,7 @@ impl<'a> Encoder<'a> {
289
307
#[ cfg( test) ]
290
308
mod test {
291
309
use super :: Encoder ;
292
- use bson;
310
+ use bson:: { Document , Bson } ;
293
311
294
312
#[ test]
295
313
fn test_encode_floating_point ( ) {
@@ -300,8 +318,8 @@ mod test {
300
318
{
301
319
let mut enc = Encoder :: new ( & mut buf) ;
302
320
303
- let mut doc = bson :: Document :: new ( ) ;
304
- doc. insert ( "key" . to_string ( ) , bson :: Bson :: FloatingPoint ( src) ) ;
321
+ let mut doc = Document :: new ( ) ;
322
+ doc. insert ( "key" . to_owned ( ) , Bson :: FloatingPoint ( src) ) ;
305
323
enc. encode_document ( & doc) . unwrap ( ) ;
306
324
}
307
325
@@ -310,32 +328,32 @@ mod test {
310
328
311
329
#[ test]
312
330
fn test_encode_utf8_string ( ) {
313
- let src = "test你好吗" . to_string ( ) ;
331
+ let src = "test你好吗" . to_owned ( ) ;
314
332
let dst = [ 28 , 0 , 0 , 0 , 2 , 107 , 101 , 121 , 0 , 14 , 0 , 0 , 0 , 116 , 101 , 115 , 116 , 228 , 189 , 160 , 229 , 165 , 189 , 229 , 144 , 151 , 0 , 0 ] ;
315
333
316
334
let mut buf = Vec :: new ( ) ;
317
335
{
318
336
let mut enc = Encoder :: new ( & mut buf) ;
319
337
320
- let mut doc = bson :: Document :: new ( ) ;
321
- doc. insert ( "key" . to_string ( ) , bson :: Bson :: String ( src) ) ;
338
+ let mut doc = Document :: new ( ) ;
339
+ doc. insert ( "key" . to_owned ( ) , Bson :: String ( src) ) ;
322
340
enc. encode_document ( & doc) . unwrap ( ) ;
323
341
}
324
342
325
- assert_eq ! ( & buf[ .. ] , & dst[ .. ] ) ;
343
+ assert_eq ! ( & buf, & dst) ;
326
344
}
327
345
328
346
#[ test]
329
347
fn test_encode_array ( ) {
330
- let src = vec ! [ bson :: Bson :: FloatingPoint ( 1.01 ) , bson :: Bson :: String ( "xyz" . to_string ( ) ) ] ;
348
+ let src = vec ! [ Bson :: FloatingPoint ( 1.01 ) , Bson :: String ( "xyz" . to_owned ( ) ) ] ;
331
349
let dst = [ 37 , 0 , 0 , 0 , 4 , 107 , 101 , 121 , 0 , 27 , 0 , 0 , 0 , 1 , 48 , 0 , 41 , 92 , 143 , 194 , 245 , 40 , 240 , 63 , 2 , 49 , 0 , 4 , 0 , 0 , 0 , 120 , 121 , 122 , 0 , 0 , 0 ] ;
332
350
333
351
let mut buf = Vec :: new ( ) ;
334
352
{
335
353
let mut enc = Encoder :: new ( & mut buf) ;
336
354
337
- let mut doc = bson :: Document :: new ( ) ;
338
- doc. insert ( "key" . to_string ( ) , bson :: Bson :: Array ( src) ) ;
355
+ let mut doc = Document :: new ( ) ;
356
+ doc. insert ( "key" . to_owned ( ) , Bson :: Array ( src) ) ;
339
357
enc. encode_document ( & doc) . unwrap ( ) ;
340
358
}
341
359
0 commit comments