@@ -23,6 +23,8 @@ use std::collections::BTreeMap;
23
23
use std:: string;
24
24
25
25
use chrono:: { DateTime , UTC } ;
26
+ use rustc_serialize:: json;
27
+ use rustc_serialize:: hex:: ToHex ;
26
28
27
29
use spec:: BinarySubtype ;
28
30
@@ -48,3 +50,64 @@ pub enum Bson {
48
50
49
51
pub type Array = Vec < Bson > ;
50
52
pub type Document = BTreeMap < String , Bson > ;
53
+
54
+ impl Bson {
55
+ pub fn to_json ( & self ) -> json:: Json {
56
+ match self {
57
+ & Bson :: FloatingPoint ( v) => json:: Json :: F64 ( v) ,
58
+ & Bson :: String ( ref v) => json:: Json :: String ( v. clone ( ) ) ,
59
+ & Bson :: Array ( ref v) =>
60
+ json:: Json :: Array ( v. iter ( ) . map ( |x| x. to_json ( ) ) . collect ( ) ) ,
61
+ & Bson :: Document ( ref v) =>
62
+ json:: Json :: Object ( v. iter ( ) . map ( |( k, v) | ( k. clone ( ) , v. to_json ( ) ) ) . collect ( ) ) ,
63
+ & Bson :: Boolean ( v) => json:: Json :: Boolean ( v) ,
64
+ & Bson :: Null => json:: Json :: Null ,
65
+ & Bson :: RegExp ( ref pat, ref opt) => {
66
+ let mut re = json:: Object :: new ( ) ;
67
+ re. insert ( "pattern" . to_string ( ) , json:: Json :: String ( pat. clone ( ) ) ) ;
68
+ re. insert ( "options" . to_string ( ) , json:: Json :: String ( opt. clone ( ) ) ) ;
69
+
70
+ json:: Json :: Object ( re)
71
+ } ,
72
+ & Bson :: JavaScriptCode ( ref code) => json:: Json :: String ( code. clone ( ) ) ,
73
+ & Bson :: JavaScriptCodeWithScope ( ref code, ref scope) => {
74
+ let mut obj = json:: Object :: new ( ) ;
75
+ obj. insert ( "code" . to_string ( ) , json:: Json :: String ( code. clone ( ) ) ) ;
76
+
77
+ let scope_obj =
78
+ scope. iter ( ) . map ( |( k, v) | ( k. clone ( ) , v. to_json ( ) ) ) . collect ( ) ;
79
+
80
+ obj. insert ( "scope" . to_string ( ) , json:: Json :: Object ( scope_obj) ) ;
81
+
82
+ json:: Json :: Object ( obj)
83
+ } ,
84
+ & Bson :: Deprecated => json:: Json :: String ( "deprecated" . to_string ( ) ) ,
85
+ & Bson :: I32 ( v) => json:: Json :: I64 ( v as i64 ) ,
86
+ & Bson :: I64 ( v) => json:: Json :: I64 ( v) ,
87
+ & Bson :: TimeStamp ( v) => json:: Json :: I64 ( v) ,
88
+ & Bson :: Binary ( t, ref v) => {
89
+ let mut obj = json:: Object :: new ( ) ;
90
+ let tval: u8 = From :: from ( t) ;
91
+ obj. insert ( "type" . to_string ( ) , json:: Json :: I64 ( tval as i64 ) ) ;
92
+ obj. insert ( "data" . to_string ( ) , json:: Json :: String ( v[ ..] . to_hex ( ) ) ) ;
93
+
94
+ json:: Json :: Object ( obj)
95
+ } ,
96
+ & Bson :: ObjectId ( v) => json:: Json :: String ( v. to_hex ( ) ) ,
97
+ & Bson :: UtcDatetime ( ref v) => json:: Json :: String ( v. to_string ( ) ) ,
98
+ }
99
+ }
100
+
101
+ pub fn from_json ( j : & json:: Json ) -> Bson {
102
+ match j {
103
+ & json:: Json :: I64 ( x) => Bson :: I64 ( x) ,
104
+ & json:: Json :: U64 ( x) => Bson :: I64 ( x as i64 ) ,
105
+ & json:: Json :: F64 ( x) => Bson :: FloatingPoint ( x) ,
106
+ & json:: Json :: String ( ref x) => Bson :: String ( x. clone ( ) ) ,
107
+ & json:: Json :: Boolean ( x) => Bson :: Boolean ( x) ,
108
+ & json:: Json :: Array ( ref x) => Bson :: Array ( x. iter ( ) . map ( |x| Bson :: from_json ( x) ) . collect ( ) ) ,
109
+ & json:: Json :: Object ( ref x) => Bson :: Document ( x. iter ( ) . map ( |( k, v) | ( k. clone ( ) , Bson :: from_json ( v) ) ) . collect ( ) ) ,
110
+ & json:: Json :: Null => Bson :: Null ,
111
+ }
112
+ }
113
+ }
0 commit comments