@@ -263,103 +263,119 @@ impl From<DateTime<UTC>> for Bson {
263
263
}
264
264
}
265
265
266
- impl Bson {
267
- /// Get the `ElementType` of this value.
268
- pub fn element_type ( & self ) -> ElementType {
269
- match self {
270
- & Bson :: FloatingPoint ( ..) => ElementType :: FloatingPoint ,
271
- & Bson :: String ( ..) => ElementType :: Utf8String ,
272
- & Bson :: Array ( ..) => ElementType :: Array ,
273
- & Bson :: Document ( ..) => ElementType :: EmbeddedDocument ,
274
- & Bson :: Boolean ( ..) => ElementType :: Boolean ,
275
- & Bson :: Null => ElementType :: NullValue ,
276
- & Bson :: RegExp ( ..) => ElementType :: RegularExpression ,
277
- & Bson :: JavaScriptCode ( ..) => ElementType :: JavaScriptCode ,
278
- & Bson :: JavaScriptCodeWithScope ( ..) => ElementType :: JavaScriptCodeWithScope ,
279
- & Bson :: I32 ( ..) => ElementType :: Integer32Bit ,
280
- & Bson :: I64 ( ..) => ElementType :: Integer64Bit ,
281
- & Bson :: TimeStamp ( ..) => ElementType :: TimeStamp ,
282
- & Bson :: Binary ( ..) => ElementType :: Binary ,
283
- & Bson :: ObjectId ( ..) => ElementType :: ObjectId ,
284
- & Bson :: UtcDatetime ( ..) => ElementType :: UtcDatetime ,
285
- & Bson :: Symbol ( ..) => ElementType :: Symbol ,
266
+ impl From < Value > for Bson {
267
+ fn from ( a : Value ) -> Bson {
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) ) ,
273
+ Value :: String ( x) => x. into ( ) ,
274
+ Value :: Bool ( x) => x. into ( ) ,
275
+ Value :: Array ( x) => Bson :: Array ( x. into_iter ( ) . map ( Bson :: from) . collect ( ) ) ,
276
+ Value :: Object ( x) => {
277
+ Bson :: from_extended_document ( x. into_iter ( )
278
+ . map ( |( k, v) | ( k. clone ( ) , v. into ( ) ) )
279
+ . collect ( ) )
280
+ }
281
+ Value :: Null => Bson :: Null ,
286
282
}
287
283
}
284
+ }
288
285
289
- /// Convert this value to the best approximate `Json`.
290
- pub fn to_json ( & self ) -> Value {
286
+ impl Into < Value > for Bson {
287
+ fn into ( self ) -> Value {
291
288
match self {
292
- & Bson :: FloatingPoint ( v) => json ! ( v) ,
293
- & Bson :: String ( ref v) => json ! ( v) ,
294
- & Bson :: Array ( ref v) => json ! ( v) ,
295
- & Bson :: Document ( ref v) => json ! ( v) ,
296
- & Bson :: Boolean ( v) => json ! ( v) ,
297
- & Bson :: Null => Value :: Null ,
298
- & Bson :: RegExp ( ref pat, ref opt) => {
299
- json ! ( {
300
- "$regex" : pat,
301
- "$options" : opt
302
- } )
303
- }
304
- & Bson :: JavaScriptCode ( ref code) => json ! ( { "$code" : code} ) ,
305
- & Bson :: JavaScriptCodeWithScope ( ref code, ref scope) => {
289
+ Bson :: FloatingPoint ( v) => json ! ( v) ,
290
+ Bson :: String ( v) => json ! ( v) ,
291
+ Bson :: Array ( v) => json ! ( v) ,
292
+ Bson :: Document ( v) => json ! ( v) ,
293
+ Bson :: Boolean ( v) => json ! ( v) ,
294
+ Bson :: Null => Value :: Null ,
295
+ Bson :: RegExp ( pat, opt) => json ! ( {
296
+ "$regex" : pat,
297
+ "$options" : opt
298
+ } ) ,
299
+ Bson :: JavaScriptCode ( code) => json ! ( { "$code" : code} ) ,
300
+ Bson :: JavaScriptCodeWithScope ( code, scope) => {
306
301
json ! ( {
307
302
"$code" : code,
308
303
"scope" : scope
309
304
} )
310
305
}
311
- & Bson :: I32 ( v) => v. into ( ) ,
312
- & Bson :: I64 ( v) => v. into ( ) ,
313
- & Bson :: TimeStamp ( v) => {
306
+ Bson :: I32 ( v) => v. into ( ) ,
307
+ Bson :: I64 ( v) => v. into ( ) ,
308
+ Bson :: TimeStamp ( v) => {
314
309
let time = v >> 32 ;
315
310
let inc = v & 0x0000FFFF ;
316
-
317
311
json ! ( {
318
312
"t" : time,
319
313
"i" : inc
320
314
} )
321
315
}
322
- & Bson :: Binary ( t, ref v) => {
316
+ Bson :: Binary ( t, ref v) => {
323
317
let tval: u8 = From :: from ( t) ;
324
318
json ! ( {
325
319
"type" : tval,
326
320
"$binary" : v. to_hex( )
327
321
} )
328
322
}
329
- & Bson :: ObjectId ( ref v) => json ! ( { "$oid" : v. to_string( ) } ) ,
330
- & Bson :: UtcDatetime ( ref v) => {
331
- json ! ( {
323
+ Bson :: ObjectId ( v) => json ! ( { "$oid" : v. to_string( ) } ) ,
324
+ Bson :: UtcDatetime ( v) => json ! ( {
332
325
"$date" : {
333
326
"$numberLong" : ( v. timestamp( ) * 1000 ) + ( ( v. nanosecond( ) / 1000000 ) as i64 )
334
327
}
335
- } )
336
- }
328
+ } ) ,
337
329
// FIXME: Don't know what is the best way to encode Symbol type
338
- & Bson :: Symbol ( ref v) => json ! ( { "$symbol" : v} ) ,
330
+ Bson :: Symbol ( v) => json ! ( { "$symbol" : v} )
339
331
}
340
332
}
333
+ }
341
334
342
- /// Create a `Bson` from a `Json`.
343
- pub fn from_json ( j : & Value ) -> Bson {
344
- match j {
345
- & Value :: Number ( ref x) => {
346
- x. as_i64 ( )
347
- . map ( Bson :: from)
348
- . or_else ( || x. as_f64 ( ) . map ( Bson :: from) )
349
- . expect ( & format ! ( "Invalid number value: {}" , x) )
350
- }
351
- & Value :: String ( ref x) => x. into ( ) ,
352
- & Value :: Bool ( x) => x. into ( ) ,
353
- & Value :: Array ( ref x) => Bson :: Array ( x. iter ( ) . map ( Bson :: from_json) . collect ( ) ) ,
354
- & Value :: Object ( ref x) => {
355
- Bson :: from_extended_document ( x. iter ( )
356
- . map ( |( k, v) | ( k. clone ( ) , Bson :: from_json ( v) ) )
357
- . collect ( ) )
358
- }
359
- & Value :: Null => Bson :: Null ,
335
+ impl Bson {
336
+ /// Get the `ElementType` of this value.
337
+ pub fn element_type ( & self ) -> ElementType {
338
+ match self {
339
+ & Bson :: FloatingPoint ( ..) => ElementType :: FloatingPoint ,
340
+ & Bson :: String ( ..) => ElementType :: Utf8String ,
341
+ & Bson :: Array ( ..) => ElementType :: Array ,
342
+ & Bson :: Document ( ..) => ElementType :: EmbeddedDocument ,
343
+ & Bson :: Boolean ( ..) => ElementType :: Boolean ,
344
+ & Bson :: Null => ElementType :: NullValue ,
345
+ & Bson :: RegExp ( ..) => ElementType :: RegularExpression ,
346
+ & Bson :: JavaScriptCode ( ..) => ElementType :: JavaScriptCode ,
347
+ & Bson :: JavaScriptCodeWithScope ( ..) => ElementType :: JavaScriptCodeWithScope ,
348
+ & Bson :: I32 ( ..) => ElementType :: Integer32Bit ,
349
+ & Bson :: I64 ( ..) => ElementType :: Integer64Bit ,
350
+ & Bson :: TimeStamp ( ..) => ElementType :: TimeStamp ,
351
+ & Bson :: Binary ( ..) => ElementType :: Binary ,
352
+ & Bson :: ObjectId ( ..) => ElementType :: ObjectId ,
353
+ & Bson :: UtcDatetime ( ..) => ElementType :: UtcDatetime ,
354
+ & Bson :: Symbol ( ..) => ElementType :: Symbol ,
360
355
}
361
356
}
362
357
358
+ /// Clones the bson and returns the representative serde_json Value.
359
+ /// The json will be in [extended JSON format](https://docs.mongodb.com/manual/reference/mongodb-extended-json/).
360
+ #[ deprecated( since="0.5.1" , note="use bson.clone().into() instead" ) ]
361
+ pub fn to_json ( & self ) -> Value {
362
+ self . clone ( ) . into ( )
363
+ }
364
+
365
+ /// Consumes the bson and returns the representative serde_json Value.
366
+ /// The json will be in [extended JSON format](https://docs.mongodb.com/manual/reference/mongodb-extended-json/).
367
+ #[ deprecated( since="0.5.1" , note="use bson.into() instead" ) ]
368
+ pub fn into_json ( self ) -> Value {
369
+ self . into ( )
370
+ }
371
+
372
+ /// Consumes the serde_json Value and returns the representative bson.
373
+ /// The json should be in [extended JSON format](https://docs.mongodb.com/manual/reference/mongodb-extended-json/).
374
+ #[ deprecated( since="0.5.1" , note="use json.into() instead" ) ]
375
+ pub fn from_json ( val : Value ) -> Bson {
376
+ val. into ( )
377
+ }
378
+
363
379
/// Converts to extended format.
364
380
/// This function mainly used for [extended JSON format](https://docs.mongodb.com/manual/reference/mongodb-extended-json/).
365
381
#[ doc( hidden) ]
0 commit comments