@@ -266,17 +266,20 @@ impl From<DateTime<UTC>> for Bson {
266
266
impl From < Value > for Bson {
267
267
fn from ( a : Value ) -> Bson {
268
268
match a {
269
- Value :: Number ( x) =>
270
- x. as_i64 ( ) . map ( Bson :: from)
271
- . or ( x. as_u64 ( ) . map ( Bson :: from) )
272
- . expect ( & format ! ( "Invalid number value: {}" , x) ) ,
269
+ Value :: Number ( x) => {
270
+ x. as_i64 ( )
271
+ . map ( Bson :: from)
272
+ . or_else ( || x. as_u64 ( ) . map ( Bson :: from) )
273
+ . or_else ( || x. as_f64 ( ) . map ( Bson :: from) )
274
+ . unwrap_or_else ( || panic ! ( "Invalid number value: {}" , x) )
275
+ }
273
276
Value :: String ( x) => x. into ( ) ,
274
277
Value :: Bool ( x) => x. into ( ) ,
275
278
Value :: Array ( x) => Bson :: Array ( x. into_iter ( ) . map ( Bson :: from) . collect ( ) ) ,
276
279
Value :: Object ( x) => {
277
280
Bson :: from_extended_document ( x. into_iter ( )
278
- . map ( |( k, v) | ( k. clone ( ) , v. into ( ) ) )
279
- . collect ( ) )
281
+ . map ( |( k, v) | ( k. clone ( ) , v. into ( ) ) )
282
+ . collect ( ) )
280
283
}
281
284
Value :: Null => Bson :: Null ,
282
285
}
@@ -292,10 +295,12 @@ impl Into<Value> for Bson {
292
295
Bson :: Document ( v) => json ! ( v) ,
293
296
Bson :: Boolean ( v) => json ! ( v) ,
294
297
Bson :: Null => Value :: Null ,
295
- Bson :: RegExp ( pat, opt) => json ! ( {
296
- "$regex" : pat,
297
- "$options" : opt
298
- } ) ,
298
+ Bson :: RegExp ( pat, opt) => {
299
+ json ! ( {
300
+ "$regex" : pat,
301
+ "$options" : opt
302
+ } )
303
+ }
299
304
Bson :: JavaScriptCode ( code) => json ! ( { "$code" : code} ) ,
300
305
Bson :: JavaScriptCodeWithScope ( code, scope) => {
301
306
json ! ( {
@@ -321,13 +326,15 @@ impl Into<Value> for Bson {
321
326
} )
322
327
}
323
328
Bson :: ObjectId ( v) => json ! ( { "$oid" : v. to_string( ) } ) ,
324
- Bson :: UtcDatetime ( v) => json ! ( {
325
- "$date" : {
326
- "$numberLong" : ( v. timestamp( ) * 1000 ) + ( ( v. nanosecond( ) / 1000000 ) as i64 )
327
- }
328
- } ) ,
329
+ Bson :: UtcDatetime ( v) => {
330
+ json ! ( {
331
+ "$date" : {
332
+ "$numberLong" : ( v. timestamp( ) * 1000 ) + ( ( v. nanosecond( ) / 1000000 ) as i64 )
333
+ }
334
+ } )
335
+ }
329
336
// FIXME: Don't know what is the best way to encode Symbol type
330
- Bson :: Symbol ( v) => json ! ( { "$symbol" : v} )
337
+ Bson :: Symbol ( v) => json ! ( { "$symbol" : v} ) ,
331
338
}
332
339
}
333
340
}
@@ -468,9 +475,11 @@ impl Bson {
468
475
} else if let Ok ( hex) = values. get_str ( "$oid" ) {
469
476
return Bson :: ObjectId ( oid:: ObjectId :: with_string ( hex) . unwrap ( ) ) ;
470
477
471
- } else if let Ok ( long) = values. get_document ( "$date" )
472
- . and_then ( |inner| inner. get_i64 ( "$numberLong" ) ) {
473
- return Bson :: UtcDatetime ( UTC . timestamp ( long / 1000 , ( long % 1000 ) as u32 * 1000000 ) ) ;
478
+ } else if let Ok ( long) = values
479
+ . get_document ( "$date" )
480
+ . and_then ( |inner| inner. get_i64 ( "$numberLong" ) ) {
481
+ return Bson :: UtcDatetime ( UTC . timestamp ( long / 1000 ,
482
+ ( long % 1000 ) as u32 * 1000000 ) ) ;
474
483
} else if let Ok ( sym) = values. get_str ( "$symbol" ) {
475
484
return Bson :: Symbol ( sym. to_owned ( ) ) ;
476
485
}
0 commit comments