@@ -500,14 +500,29 @@ impl Document {
500
500
}
501
501
502
502
/// Attempts to serialize the `Document` into a byte stream.
503
- pub fn to_writer < W : Write + ?Sized > ( & self , writer : & mut W ) -> crate :: ser:: Result < ( ) > {
503
+ ///
504
+ /// While the method signature indicates an owned writer must be passed in, a mutable reference
505
+ /// may also be passed in due to blanket implementations of `Write` provided in the standard
506
+ /// library.
507
+ ///
508
+ /// ```
509
+ /// # fn main() -> bson::ser::Result<()> {
510
+ /// use bson::doc;
511
+ ///
512
+ /// let mut v: Vec<u8> = Vec::new();
513
+ /// let doc = doc! { "x" : 1 };
514
+ /// doc.to_writer(&mut v)?;
515
+ /// # Ok(())
516
+ /// # }
517
+ /// ```
518
+ pub fn to_writer < W : Write > ( & self , mut writer : W ) -> crate :: ser:: Result < ( ) > {
504
519
let mut buf = Vec :: new ( ) ;
505
520
for ( key, val) in self . into_iter ( ) {
506
521
serialize_bson ( & mut buf, key. as_ref ( ) , val) ?;
507
522
}
508
523
509
524
write_i32 (
510
- writer,
525
+ & mut writer,
511
526
( buf. len ( ) + mem:: size_of :: < i32 > ( ) + mem:: size_of :: < u8 > ( ) ) as i32 ,
512
527
) ?;
513
528
writer. write_all ( & buf) ?;
@@ -551,8 +566,35 @@ impl Document {
551
566
}
552
567
553
568
/// Attempts to deserialize a `Document` from a byte stream.
554
- pub fn from_reader < R : Read + ?Sized > ( reader : & mut R ) -> crate :: de:: Result < Document > {
555
- Self :: decode ( reader, false )
569
+ ///
570
+ /// While the method signature indicates an owned reader must be passed in, a mutable reference
571
+ /// may also be passed in due to blanket implementations of `Read` provided in the standard
572
+ /// library.
573
+ ///
574
+ /// ```
575
+ /// # use std::error::Error;
576
+ /// # fn main() -> std::result::Result<(), Box<dyn Error>> {
577
+ /// use bson::{doc, Document};
578
+ /// use std::io::Cursor;
579
+ ///
580
+ /// let mut v: Vec<u8> = Vec::new();
581
+ /// let doc = doc! { "x" : 1 };
582
+ /// doc.to_writer(&mut v)?;
583
+ ///
584
+ /// // read from mutable reference
585
+ /// let mut reader = Cursor::new(v.clone());
586
+ /// let doc1 = Document::from_reader(&mut reader)?;
587
+ ///
588
+ /// // read from owned value
589
+ /// let doc2 = Document::from_reader(Cursor::new(v))?;
590
+ ///
591
+ /// assert_eq!(doc, doc1);
592
+ /// assert_eq!(doc, doc2);
593
+ /// # Ok(())
594
+ /// # }
595
+ /// ```
596
+ pub fn from_reader < R : Read > ( mut reader : R ) -> crate :: de:: Result < Document > {
597
+ Self :: decode ( & mut reader, false )
556
598
}
557
599
558
600
/// Attempt to deserialize a `Document` that may contain invalid UTF-8 strings from a byte
@@ -561,8 +603,8 @@ impl Document {
561
603
/// This is mainly useful when reading raw BSON returned from a MongoDB server, which
562
604
/// in rare cases can contain invalidly truncated strings (https://jira.mongodb.org/browse/SERVER-24007).
563
605
/// For most use cases, `Document::from_reader` can be used instead.
564
- pub fn from_reader_utf8_lossy < R : Read + ? Sized > ( reader : & mut R ) -> crate :: de:: Result < Document > {
565
- Self :: decode ( reader, true )
606
+ pub fn from_reader_utf8_lossy < R : Read > ( mut reader : R ) -> crate :: de:: Result < Document > {
607
+ Self :: decode ( & mut reader, true )
566
608
}
567
609
}
568
610
0 commit comments