mongodb 1.2.1

The official MongoDB driver for Rust
Documentation
use futures::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};

use crate::{
    bson::Document,
    error::Result,
    runtime::{AsyncLittleEndianRead, AsyncLittleEndianWrite},
};

pub(crate) async fn decode_document<R: AsyncRead + Unpin + Send>(
    reader: &mut R,
) -> Result<Document> {
    let length = reader.read_i32().await?;

    let mut bytes = Vec::new();
    bytes.write_i32(length).await?;

    reader
        .take(length as u64 - 4)
        .read_to_end(&mut bytes)
        .await?;

    let document = Document::from_reader(&mut bytes.as_slice())?;
    Ok(document)
}

pub(crate) async fn encode_document<W: AsyncWrite + Unpin + Send>(
    writer: &mut W,
    document: &Document,
) -> Result<()> {
    let mut bytes = Vec::new();

    document.to_writer(&mut bytes)?;

    writer.write_all(&bytes).await?;

    Ok(())
}