@@ -33,12 +33,11 @@ pub use self::{
33
33
use std:: io:: Read ;
34
34
35
35
use crate :: {
36
- bson:: { Array , Bson , DbPointer , Document , JavaScriptCodeWithScope , Regex , Timestamp } ,
37
- oid:: { self , ObjectId } ,
36
+ bson:: { Bson , Document , Timestamp } ,
37
+ oid:: ObjectId ,
38
38
raw:: RawBinaryRef ,
39
39
ser:: write_i32,
40
- spec:: { self , BinarySubtype } ,
41
- Binary ,
40
+ spec:: BinarySubtype ,
42
41
Decimal128 ,
43
42
} ;
44
43
@@ -49,7 +48,6 @@ use ::serde::{
49
48
50
49
pub ( crate ) use self :: serde:: { convert_unsigned_to_signed_raw, BsonVisitor } ;
51
50
52
- #[ cfg( test) ]
53
51
pub ( crate ) use self :: raw:: Deserializer as RawDeserializer ;
54
52
55
53
pub ( crate ) const MAX_BSON_SIZE : i32 = 16 * 1024 * 1024 ;
@@ -73,30 +71,6 @@ enum DeserializerHint {
73
71
RawBson ,
74
72
}
75
73
76
- /// Run the provided closure, ensuring that over the course of its execution, exactly `length` bytes
77
- /// were read from the reader.
78
- pub ( crate ) fn ensure_read_exactly < F , R > (
79
- reader : & mut R ,
80
- length : usize ,
81
- error_message : & str ,
82
- func : F ,
83
- ) -> Result < ( ) >
84
- where
85
- F : FnOnce ( & mut std:: io:: Cursor < Vec < u8 > > ) -> Result < ( ) > ,
86
- R : Read + ?Sized ,
87
- {
88
- let mut buf = vec ! [ 0u8 ; length] ;
89
- reader. read_exact ( & mut buf) ?;
90
- let mut cursor = std:: io:: Cursor :: new ( buf) ;
91
-
92
- func ( & mut cursor) ?;
93
-
94
- if cursor. position ( ) != length as u64 {
95
- return Err ( Error :: invalid_length ( length, & error_message) ) ;
96
- }
97
- Ok ( ( ) )
98
- }
99
-
100
74
pub ( crate ) fn read_string < R : Read + ?Sized > ( reader : & mut R , utf8_lossy : bool ) -> Result < String > {
101
75
let len = read_i32 ( reader) ?;
102
76
@@ -141,20 +115,6 @@ pub(crate) fn read_bool<R: Read>(mut reader: R) -> Result<bool> {
141
115
Ok ( val != 0 )
142
116
}
143
117
144
- fn read_cstring < R : Read + ?Sized > ( reader : & mut R ) -> Result < String > {
145
- let mut v = Vec :: new ( ) ;
146
-
147
- loop {
148
- let c = read_u8 ( reader) ?;
149
- if c == 0 {
150
- break ;
151
- }
152
- v. push ( c) ;
153
- }
154
-
155
- Ok ( String :: from_utf8 ( v) ?)
156
- }
157
-
158
118
#[ inline]
159
119
pub ( crate ) fn read_u8 < R : Read + ?Sized > ( reader : & mut R ) -> Result < u8 > {
160
120
let mut buf = [ 0 ; 1 ] ;
@@ -192,138 +152,6 @@ fn read_f128<R: Read + ?Sized>(reader: &mut R) -> Result<Decimal128> {
192
152
Ok ( Decimal128 { bytes : buf } )
193
153
}
194
154
195
- fn deserialize_array < R : Read + ?Sized > ( reader : & mut R , utf8_lossy : bool ) -> Result < Array > {
196
- let mut arr = Array :: new ( ) ;
197
- let length = read_i32 ( reader) ?;
198
-
199
- if !( MIN_BSON_DOCUMENT_SIZE ..=MAX_BSON_SIZE ) . contains ( & length) {
200
- return Err ( Error :: invalid_length (
201
- length as usize ,
202
- & format ! (
203
- "array length must be between {} and {}" ,
204
- MIN_BSON_DOCUMENT_SIZE , MAX_BSON_SIZE
205
- )
206
- . as_str ( ) ,
207
- ) ) ;
208
- }
209
-
210
- ensure_read_exactly (
211
- reader,
212
- ( length as usize ) - 4 ,
213
- "array length longer than contents" ,
214
- |cursor| {
215
- loop {
216
- let tag = read_u8 ( cursor) ?;
217
- if tag == 0 {
218
- break ;
219
- }
220
-
221
- let ( _, val) = deserialize_bson_kvp ( cursor, tag, utf8_lossy) ?;
222
- arr. push ( val)
223
- }
224
- Ok ( ( ) )
225
- } ,
226
- ) ?;
227
-
228
- Ok ( arr)
229
- }
230
-
231
- pub ( crate ) fn deserialize_bson_kvp < R : Read + ?Sized > (
232
- reader : & mut R ,
233
- tag : u8 ,
234
- utf8_lossy : bool ,
235
- ) -> Result < ( String , Bson ) > {
236
- use spec:: ElementType ;
237
- let key = read_cstring ( reader) ?;
238
-
239
- let val = match ElementType :: from ( tag) {
240
- Some ( ElementType :: Double ) => Bson :: Double ( read_f64 ( reader) ?) ,
241
- Some ( ElementType :: String ) => read_string ( reader, utf8_lossy) . map ( Bson :: String ) ?,
242
- Some ( ElementType :: EmbeddedDocument ) => Document :: from_reader ( reader) . map ( Bson :: Document ) ?,
243
- Some ( ElementType :: Array ) => deserialize_array ( reader, utf8_lossy) . map ( Bson :: Array ) ?,
244
- Some ( ElementType :: Binary ) => Bson :: Binary ( Binary :: from_reader ( reader) ?) ,
245
- Some ( ElementType :: ObjectId ) => {
246
- let mut objid = [ 0 ; 12 ] ;
247
- for x in & mut objid {
248
- * x = read_u8 ( reader) ?;
249
- }
250
- Bson :: ObjectId ( oid:: ObjectId :: from_bytes ( objid) )
251
- }
252
- Some ( ElementType :: Boolean ) => Bson :: Boolean ( read_bool ( reader) ?) ,
253
- Some ( ElementType :: Null ) => Bson :: Null ,
254
- Some ( ElementType :: RegularExpression ) => {
255
- Bson :: RegularExpression ( Regex :: from_reader ( reader) ?)
256
- }
257
- Some ( ElementType :: JavaScriptCode ) => {
258
- read_string ( reader, utf8_lossy) . map ( Bson :: JavaScriptCode ) ?
259
- }
260
- Some ( ElementType :: JavaScriptCodeWithScope ) => {
261
- Bson :: JavaScriptCodeWithScope ( JavaScriptCodeWithScope :: from_reader ( reader, utf8_lossy) ?)
262
- }
263
- Some ( ElementType :: Int32 ) => read_i32 ( reader) . map ( Bson :: Int32 ) ?,
264
- Some ( ElementType :: Int64 ) => read_i64 ( reader) . map ( Bson :: Int64 ) ?,
265
- Some ( ElementType :: Timestamp ) => Bson :: Timestamp ( Timestamp :: from_reader ( reader) ?) ,
266
- Some ( ElementType :: DateTime ) => {
267
- // The int64 is UTC milliseconds since the Unix epoch.
268
- let time = read_i64 ( reader) ?;
269
- Bson :: DateTime ( crate :: DateTime :: from_millis ( time) )
270
- }
271
- Some ( ElementType :: Symbol ) => read_string ( reader, utf8_lossy) . map ( Bson :: Symbol ) ?,
272
- Some ( ElementType :: Decimal128 ) => read_f128 ( reader) . map ( Bson :: Decimal128 ) ?,
273
- Some ( ElementType :: Undefined ) => Bson :: Undefined ,
274
- Some ( ElementType :: DbPointer ) => Bson :: DbPointer ( DbPointer :: from_reader ( reader) ?) ,
275
- Some ( ElementType :: MaxKey ) => Bson :: MaxKey ,
276
- Some ( ElementType :: MinKey ) => Bson :: MinKey ,
277
- None => {
278
- return Err ( Error :: UnrecognizedDocumentElementType {
279
- key,
280
- element_type : tag,
281
- } )
282
- }
283
- } ;
284
-
285
- Ok ( ( key, val) )
286
- }
287
-
288
- impl Binary {
289
- pub ( crate ) fn from_reader < R : Read > ( mut reader : R ) -> Result < Self > {
290
- let mut len = read_i32 ( & mut reader) ?;
291
- if !( 0 ..=MAX_BSON_SIZE ) . contains ( & len) {
292
- return Err ( Error :: invalid_length (
293
- len as usize ,
294
- & format ! ( "binary length must be between 0 and {}" , MAX_BSON_SIZE ) . as_str ( ) ,
295
- ) ) ;
296
- }
297
- let subtype = BinarySubtype :: from ( read_u8 ( & mut reader) ?) ;
298
-
299
- // Skip length data in old binary.
300
- if let BinarySubtype :: BinaryOld = subtype {
301
- let data_len = read_i32 ( & mut reader) ?;
302
-
303
- if !( 0 ..=( MAX_BSON_SIZE - 4 ) ) . contains ( & data_len) {
304
- return Err ( Error :: invalid_length (
305
- data_len as usize ,
306
- & format ! ( "0x02 length must be between 0 and {}" , MAX_BSON_SIZE - 4 ) . as_str ( ) ,
307
- ) ) ;
308
- }
309
-
310
- if data_len + 4 != len {
311
- return Err ( Error :: invalid_length (
312
- data_len as usize ,
313
- & "0x02 length did not match top level binary length" ,
314
- ) ) ;
315
- }
316
-
317
- len -= 4 ;
318
- }
319
-
320
- let mut bytes = Vec :: with_capacity ( len as usize ) ;
321
-
322
- reader. take ( len as u64 ) . read_to_end ( & mut bytes) ?;
323
- Ok ( Binary { subtype, bytes } )
324
- }
325
- }
326
-
327
155
impl < ' a > RawBinaryRef < ' a > {
328
156
pub ( crate ) fn from_slice_with_len_and_payload (
329
157
mut bytes : & ' a [ u8 ] ,
@@ -368,29 +196,11 @@ impl<'a> RawBinaryRef<'a> {
368
196
}
369
197
}
370
198
371
- impl DbPointer {
372
- pub ( crate ) fn from_reader < R : Read > ( mut reader : R ) -> Result < Self > {
373
- let ns = read_string ( & mut reader, false ) ?;
374
- let oid = ObjectId :: from_reader ( & mut reader) ?;
375
- Ok ( DbPointer {
376
- namespace : ns,
377
- id : oid,
378
- } )
379
- }
380
- }
381
-
382
- impl Regex {
383
- pub ( crate ) fn from_reader < R : Read > ( mut reader : R ) -> Result < Self > {
384
- let pattern = read_cstring ( & mut reader) ?;
385
- let options = read_cstring ( & mut reader) ?;
386
-
387
- Ok ( Regex { pattern, options } )
388
- }
389
- }
390
-
391
199
impl Timestamp {
392
200
pub ( crate ) fn from_reader < R : Read > ( mut reader : R ) -> Result < Self > {
393
- read_i64 ( & mut reader) . map ( Timestamp :: from_le_i64)
201
+ let mut bytes = [ 0 ; 8 ] ;
202
+ reader. read_exact ( & mut bytes) ?;
203
+ Ok ( Timestamp :: from_le_bytes ( bytes) )
394
204
}
395
205
}
396
206
@@ -402,35 +212,6 @@ impl ObjectId {
402
212
}
403
213
}
404
214
405
- impl JavaScriptCodeWithScope {
406
- pub ( crate ) fn from_reader < R : Read > ( mut reader : R , utf8_lossy : bool ) -> Result < Self > {
407
- let length = read_i32 ( & mut reader) ?;
408
- if length < MIN_CODE_WITH_SCOPE_SIZE {
409
- return Err ( Error :: invalid_length (
410
- length as usize ,
411
- & format ! (
412
- "code with scope length must be at least {}" ,
413
- MIN_CODE_WITH_SCOPE_SIZE
414
- )
415
- . as_str ( ) ,
416
- ) ) ;
417
- } else if length > MAX_BSON_SIZE {
418
- return Err ( Error :: invalid_length (
419
- length as usize ,
420
- & "code with scope length too large" ,
421
- ) ) ;
422
- }
423
-
424
- let mut buf = vec ! [ 0u8 ; ( length - 4 ) as usize ] ;
425
- reader. read_exact ( & mut buf) ?;
426
-
427
- let mut slice = buf. as_slice ( ) ;
428
- let code = read_string ( & mut slice, utf8_lossy) ?;
429
- let scope = Document :: from_reader ( & mut slice) ?;
430
- Ok ( JavaScriptCodeWithScope { code, scope } )
431
- }
432
- }
433
-
434
215
/// Deserialize a `T` from the provided [`Bson`] value.
435
216
///
436
217
/// The [`Deserializer`] used by this function presents itself as human readable, whereas the
0 commit comments