@@ -92,130 +92,132 @@ impl error::Error for DecoderError {
92
92
pub type DecoderResult < T > = Result < T , DecoderError > ;
93
93
94
94
fn read_string < R : Read + ?Sized > ( reader : & mut R ) -> DecoderResult < String > {
95
- let len = try!( reader. read_i32 :: < LittleEndian > ( ) ) ;
95
+ let len = try!( reader. read_i32 :: < LittleEndian > ( ) ) ;
96
96
97
- let mut s = String :: with_capacity ( len as usize - 1 ) ;
98
- try!( reader. take ( len as u64 - 1 ) . read_to_string ( & mut s) ) ;
99
- try!( reader. read_u8 ( ) ) ; // The last 0x00
97
+ let mut s = String :: with_capacity ( len as usize - 1 ) ;
98
+ try!( reader. take ( len as u64 - 1 ) . read_to_string ( & mut s) ) ;
99
+ try!( reader. read_u8 ( ) ) ; // The last 0x00
100
100
101
- Ok ( s)
101
+ Ok ( s)
102
102
}
103
103
104
104
fn read_cstring < R : Read + ?Sized > ( reader : & mut R ) -> DecoderResult < String > {
105
- let mut v = Vec :: new ( ) ;
105
+ let mut v = Vec :: new ( ) ;
106
106
107
- loop {
108
- let c = try!( reader. read_u8 ( ) ) ;
109
- if c == 0 { break ; }
110
- v. push ( c) ;
111
- }
107
+ loop {
108
+ let c = try!( reader. read_u8 ( ) ) ;
109
+ if c == 0 { break ; }
110
+ v. push ( c) ;
111
+ }
112
112
113
- Ok ( try!( str:: from_utf8 ( & v) ) . to_owned ( ) )
113
+ Ok ( try!( str:: from_utf8 ( & v) ) . to_owned ( ) )
114
114
}
115
115
116
+ #[ inline]
116
117
fn read_i32 < R : Read + ?Sized > ( reader : & mut R ) -> DecoderResult < i32 > {
117
- reader. read_i32 :: < LittleEndian > ( ) . map_err ( From :: from)
118
+ reader. read_i32 :: < LittleEndian > ( ) . map_err ( From :: from)
118
119
}
119
120
121
+ #[ inline]
120
122
fn read_i64 < R : Read + ?Sized > ( reader : & mut R ) -> DecoderResult < i64 > {
121
- reader. read_i64 :: < LittleEndian > ( ) . map_err ( From :: from)
123
+ reader. read_i64 :: < LittleEndian > ( ) . map_err ( From :: from)
122
124
}
123
125
124
126
pub fn decode_document < R : Read + ?Sized > ( reader : & mut R ) -> DecoderResult < Document > {
125
- let mut doc = Document :: new ( ) ;
127
+ let mut doc = Document :: new ( ) ;
126
128
127
- // disregard the length: using Read::take causes infinite type recursion
128
- try!( read_i32 ( reader) ) ;
129
+ // disregard the length: using Read::take causes infinite type recursion
130
+ try!( read_i32 ( reader) ) ;
129
131
130
- loop {
131
- let tag = try!( reader. read_u8 ( ) ) ;
132
+ loop {
133
+ let tag = try!( reader. read_u8 ( ) ) ;
132
134
133
- if tag == 0 {
134
- break ;
135
- }
135
+ if tag == 0 {
136
+ break ;
137
+ }
136
138
137
- let key = try!( read_cstring ( reader) ) ;
138
- let val = try!( decode_bson ( reader, tag) ) ;
139
+ let key = try!( read_cstring ( reader) ) ;
140
+ let val = try!( decode_bson ( reader, tag) ) ;
139
141
140
- doc. insert ( key, val) ;
141
- }
142
+ doc. insert ( key, val) ;
143
+ }
142
144
143
- Ok ( doc)
145
+ Ok ( doc)
144
146
}
145
147
146
148
fn decode_array < R : Read + ?Sized > ( reader : & mut R ) -> DecoderResult < Array > {
147
- let mut arr = Array :: new ( ) ;
149
+ let mut arr = Array :: new ( ) ;
148
150
149
- // disregard the length: using Read::take causes infinite type recursion
150
- try!( read_i32 ( reader) ) ;
151
+ // disregard the length: using Read::take causes infinite type recursion
152
+ try!( read_i32 ( reader) ) ;
151
153
152
- loop {
153
- let tag = try!( reader. read_u8 ( ) ) ;
154
- if tag == 0 {
155
- break ;
156
- }
154
+ loop {
155
+ let tag = try!( reader. read_u8 ( ) ) ;
156
+ if tag == 0 {
157
+ break ;
158
+ }
157
159
158
- // check that the key is as expected
159
- let key = try!( read_cstring ( reader) ) ;
160
- if key != & arr. len ( ) . to_string ( ) [ ..] {
161
- return Err ( DecoderError :: InvalidArrayKey ( arr. len ( ) , key) ) ;
162
- }
160
+ // check that the key is as expected
161
+ let key = try!( read_cstring ( reader) ) ;
162
+ if key != & arr. len ( ) . to_string ( ) [ ..] {
163
+ return Err ( DecoderError :: InvalidArrayKey ( arr. len ( ) , key) ) ;
164
+ }
163
165
164
- let val = try!( decode_bson ( reader, tag) ) ;
165
- arr. push ( val)
166
- }
166
+ let val = try!( decode_bson ( reader, tag) ) ;
167
+ arr. push ( val)
168
+ }
167
169
168
- Ok ( arr)
170
+ Ok ( arr)
169
171
}
170
172
171
173
fn decode_bson < R : Read + ?Sized > ( reader : & mut R , tag : u8 ) -> DecoderResult < Bson > {
172
- use spec:: ElementType :: * ;
173
- match spec:: ElementType :: from ( tag) {
174
- Some ( FloatingPoint ) => {
175
- Ok ( Bson :: FloatingPoint ( try!( reader. read_f64 :: < LittleEndian > ( ) ) ) )
176
- } ,
177
- Some ( Utf8String ) => read_string ( reader) . map ( Bson :: String ) ,
178
- Some ( EmbeddedDocument ) => decode_document ( reader) . map ( Bson :: Document ) ,
179
- Some ( Array ) => decode_array ( reader) . map ( Bson :: Array ) ,
180
- Some ( Binary ) => {
181
- let len = try!( read_i32 ( reader) ) ;
182
- let subtype = BinarySubtype :: from ( try!( reader. read_u8 ( ) ) ) ;
183
- let mut data = Vec :: with_capacity ( len as usize ) ;
184
- try!( reader. take ( len as u64 ) . read_to_end ( & mut data) ) ;
185
- Ok ( Bson :: Binary ( subtype, data) )
186
- }
187
- Some ( ObjectId ) => {
188
- let mut objid = [ 0 ; 12 ] ;
189
- for x in & mut objid {
190
- * x = try!( reader. read_u8 ( ) ) ;
191
- }
192
- Ok ( Bson :: ObjectId ( objid) )
193
- }
194
- Some ( Boolean ) => Ok ( Bson :: Boolean ( try!( reader. read_u8 ( ) ) != 0 ) ) ,
195
- Some ( NullValue ) => Ok ( Bson :: Null ) ,
196
- Some ( RegularExpression ) => {
197
- let pat = try!( read_cstring ( reader) ) ;
198
- let opt = try!( read_cstring ( reader) ) ;
199
- Ok ( Bson :: RegExp ( pat, opt) )
200
- } ,
201
- Some ( JavaScriptCode ) => read_string ( reader) . map ( Bson :: JavaScriptCode ) ,
202
- Some ( JavaScriptCodeWithScope ) => {
203
- let code = try!( read_string ( reader) ) ;
204
- let scope = try!( decode_document ( reader) ) ;
205
- Ok ( Bson :: JavaScriptCodeWithScope ( code, scope) )
206
- } ,
207
- Some ( Deprecated ) => Ok ( Bson :: Deprecated ) ,
208
- Some ( Integer32Bit ) => read_i32 ( reader) . map ( Bson :: I32 ) ,
209
- Some ( Integer64Bit ) => read_i64 ( reader) . map ( Bson :: I64 ) ,
210
- Some ( TimeStamp ) => read_i64 ( reader) . map ( Bson :: TimeStamp ) ,
211
- Some ( UtcDatetime ) => {
212
- let time = try!( read_i64 ( reader) ) ;
213
- Ok ( Bson :: UtcDatetime ( DateTime :: from_utc ( NaiveDateTime :: from_timestamp ( time, 0 ) , UTC ) ) )
214
- } ,
215
- Some ( Undefined ) |
216
- Some ( DbPointer ) |
217
- Some ( MaxKey ) |
218
- Some ( MinKey ) |
219
- None => Err ( DecoderError :: UnrecognizedElementType ( tag) )
220
- }
174
+ use spec:: ElementType :: * ;
175
+ match spec:: ElementType :: from ( tag) {
176
+ Some ( FloatingPoint ) => {
177
+ Ok ( Bson :: FloatingPoint ( try!( reader. read_f64 :: < LittleEndian > ( ) ) ) )
178
+ } ,
179
+ Some ( Utf8String ) => read_string ( reader) . map ( Bson :: String ) ,
180
+ Some ( EmbeddedDocument ) => decode_document ( reader) . map ( Bson :: Document ) ,
181
+ Some ( Array ) => decode_array ( reader) . map ( Bson :: Array ) ,
182
+ Some ( Binary ) => {
183
+ let len = try!( read_i32 ( reader) ) ;
184
+ let subtype = BinarySubtype :: from ( try!( reader. read_u8 ( ) ) ) ;
185
+ let mut data = Vec :: with_capacity ( len as usize ) ;
186
+ try!( reader. take ( len as u64 ) . read_to_end ( & mut data) ) ;
187
+ Ok ( Bson :: Binary ( subtype, data) )
188
+ }
189
+ Some ( ObjectId ) => {
190
+ let mut objid = [ 0 ; 12 ] ;
191
+ for x in & mut objid {
192
+ * x = try!( reader. read_u8 ( ) ) ;
193
+ }
194
+ Ok ( Bson :: ObjectId ( objid) )
195
+ }
196
+ Some ( Boolean ) => Ok ( Bson :: Boolean ( try!( reader. read_u8 ( ) ) != 0 ) ) ,
197
+ Some ( NullValue ) => Ok ( Bson :: Null ) ,
198
+ Some ( RegularExpression ) => {
199
+ let pat = try!( read_cstring ( reader) ) ;
200
+ let opt = try!( read_cstring ( reader) ) ;
201
+ Ok ( Bson :: RegExp ( pat, opt) )
202
+ } ,
203
+ Some ( JavaScriptCode ) => read_string ( reader) . map ( Bson :: JavaScriptCode ) ,
204
+ Some ( JavaScriptCodeWithScope ) => {
205
+ let code = try!( read_string ( reader) ) ;
206
+ let scope = try!( decode_document ( reader) ) ;
207
+ Ok ( Bson :: JavaScriptCodeWithScope ( code, scope) )
208
+ } ,
209
+ Some ( Deprecated ) => Ok ( Bson :: Deprecated ) ,
210
+ Some ( Integer32Bit ) => read_i32 ( reader) . map ( Bson :: I32 ) ,
211
+ Some ( Integer64Bit ) => read_i64 ( reader) . map ( Bson :: I64 ) ,
212
+ Some ( TimeStamp ) => read_i64 ( reader) . map ( Bson :: TimeStamp ) ,
213
+ Some ( UtcDatetime ) => {
214
+ let time = try!( read_i64 ( reader) ) ;
215
+ Ok ( Bson :: UtcDatetime ( DateTime :: from_utc ( NaiveDateTime :: from_timestamp ( time, 0 ) , UTC ) ) )
216
+ } ,
217
+ Some ( Undefined ) |
218
+ Some ( DbPointer ) |
219
+ Some ( MaxKey ) |
220
+ Some ( MinKey ) |
221
+ None => Err ( DecoderError :: UnrecognizedElementType ( tag) )
222
+ }
221
223
}
0 commit comments