2424use std:: fmt:: { self , Debug , Display } ;
2525use std:: ops:: { Deref , DerefMut } ;
2626
27- use chrono:: { DateTime , Timelike , Utc } ;
2827use chrono:: offset:: TimeZone ;
29- use hex:: { FromHex , ToHex } ;
28+ use chrono:: { DateTime , Timelike , Utc } ;
29+ use hex;
3030use serde_json:: Value ;
3131
3232use oid;
@@ -107,7 +107,7 @@ impl Debug for Bson {
107107
108108 write ! ( f, "TimeStamp({}, {})" , time, inc)
109109 }
110- & Bson :: Binary ( t, ref vec) => write ! ( f, "BinData({}, 0x{})" , u8 :: from( t) , vec . to_hex ( ) ) ,
110+ & Bson :: Binary ( t, ref vec) => write ! ( f, "BinData({}, 0x{})" , u8 :: from( t) , hex :: encode ( vec ) ) ,
111111 & Bson :: ObjectId ( ref id) => write ! ( f, "ObjectId({:?})" , id) ,
112112 & Bson :: UtcDatetime ( date_time) => write ! ( f, "UtcDatetime({:?})" , date_time) ,
113113 & Bson :: Symbol ( ref sym) => write ! ( f, "Symbol({:?})" , sym) ,
@@ -148,7 +148,7 @@ impl Display for Bson {
148148
149149 write ! ( fmt, "Timestamp({}, {})" , time, inc)
150150 }
151- & Bson :: Binary ( t, ref vec) => write ! ( fmt, "BinData({}, 0x{})" , u8 :: from( t) , vec . to_hex ( ) ) ,
151+ & Bson :: Binary ( t, ref vec) => write ! ( fmt, "BinData({}, 0x{})" , u8 :: from( t) , hex :: encode ( vec ) ) ,
152152 & Bson :: ObjectId ( ref id) => write ! ( fmt, "ObjectId(\" {}\" )" , id) ,
153153 & Bson :: UtcDatetime ( date_time) => write ! ( fmt, "Date(\" {}\" )" , date_time) ,
154154 & Bson :: Symbol ( ref sym) => write ! ( fmt, "Symbol(\" {}\" )" , sym) ,
@@ -270,12 +270,11 @@ impl From<DateTime<Utc>> for Bson {
270270impl From < Value > for Bson {
271271 fn from ( a : Value ) -> Bson {
272272 match a {
273- Value :: Number ( x) => {
274- x. as_i64 ( ) . map ( Bson :: from)
275- . or_else ( || x. as_u64 ( ) . map ( Bson :: from) )
276- . or_else ( || x. as_f64 ( ) . map ( Bson :: from) )
277- . unwrap_or_else ( || panic ! ( "Invalid number value: {}" , x) )
278- }
273+ Value :: Number ( x) => x. as_i64 ( )
274+ . map ( Bson :: from)
275+ . or_else ( || x. as_u64 ( ) . map ( Bson :: from) )
276+ . or_else ( || x. as_f64 ( ) . map ( Bson :: from) )
277+ . unwrap_or_else ( || panic ! ( "Invalid number value: {}" , x) ) ,
279278 Value :: String ( x) => x. into ( ) ,
280279 Value :: Bool ( x) => x. into ( ) ,
281280 Value :: Array ( x) => Bson :: Array ( x. into_iter ( ) . map ( Bson :: from) . collect ( ) ) ,
@@ -296,19 +295,15 @@ impl Into<Value> for Bson {
296295 Bson :: Document ( v) => json ! ( v) ,
297296 Bson :: Boolean ( v) => json ! ( v) ,
298297 Bson :: Null => Value :: Null ,
299- Bson :: RegExp ( pat, opt) => {
300- json ! ( {
298+ Bson :: RegExp ( pat, opt) => json ! ( {
301299 "$regex" : pat,
302300 "$options" : opt
303- } )
304- }
301+ } ) ,
305302 Bson :: JavaScriptCode ( code) => json ! ( { "$code" : code } ) ,
306- Bson :: JavaScriptCodeWithScope ( code, scope) => {
307- json ! ( {
303+ Bson :: JavaScriptCodeWithScope ( code, scope) => json ! ( {
308304 "$code" : code,
309305 "scope" : scope
310- } )
311- }
306+ } ) ,
312307 Bson :: I32 ( v) => v. into ( ) ,
313308 Bson :: I64 ( v) => v. into ( ) ,
314309 Bson :: TimeStamp ( v) => {
@@ -323,17 +318,15 @@ impl Into<Value> for Bson {
323318 let tval: u8 = From :: from ( t) ;
324319 json ! ( {
325320 "type" : tval,
326- "$binary" : v . to_hex ( )
321+ "$binary" : hex :: encode ( v ) ,
327322 } )
328323 }
329324 Bson :: ObjectId ( v) => json ! ( { "$oid" : v. to_string( ) } ) ,
330- Bson :: UtcDatetime ( v) => {
331- json ! ( {
325+ Bson :: UtcDatetime ( v) => json ! ( {
332326 "$date" : {
333327 "$numberLong" : ( v. timestamp( ) * 1000 ) + ( ( v. nanosecond( ) / 1000000 ) as i64 )
334328 }
335- } )
336- }
329+ } ) ,
337330 // FIXME: Don't know what is the best way to encode Symbol type
338331 Bson :: Symbol ( v) => json ! ( { "$symbol" : v } ) ,
339332 }
@@ -418,7 +411,7 @@ impl Bson {
418411 Bson :: Binary ( t, ref v) => {
419412 let tval: u8 = From :: from ( t) ;
420413 doc ! {
421- "$binary" : v . to_hex ( ) ,
414+ "$binary" : hex :: encode ( v ) ,
422415 "type" : tval as i64 ,
423416 }
424417 }
@@ -460,8 +453,7 @@ impl Bson {
460453 return Bson :: TimeStamp ( timestamp) ;
461454 } else if let ( Ok ( hex) , Ok ( t) ) = ( values. get_str ( "$binary" ) , values. get_i64 ( "type" ) ) {
462455 let ttype = t as u8 ;
463- return Bson :: Binary ( From :: from ( ttype) ,
464- FromHex :: from_hex ( hex. as_bytes ( ) ) . unwrap ( ) ) ;
456+ return Bson :: Binary ( From :: from ( ttype) , hex:: decode ( hex. as_bytes ( ) ) . expect ( "$binary value is not a valid Hex encoded bytes" ) ) ;
465457 }
466458 } else if values. len ( ) == 1 {
467459 if let Ok ( code) = values. get_str ( "$code" ) {
0 commit comments