async_ioutil/
copy.rs

1use futures::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
2use std::io::Result;
3use std::marker::Unpin;
4
5/// Copy data from reader to writer with buffer.
6pub async fn copy_buffer<R, W>(reader: &mut R, writer: &mut W, buffer: &mut [u8]) -> Result<usize>
7where
8    R: AsyncRead + Unpin,
9    W: AsyncWrite + Unpin,
10{
11    let mut written = 0;
12    loop {
13        let nr = reader.read(&mut buffer[..]).await?;
14        if nr > 0 {
15            let nw = writer.write(&buffer[..nr]).await?;
16            written += nw;
17        } else {
18            break;
19        }
20    }
21    Ok(written)
22}
23
24/// Copy data from reader to writer without buffer.
25pub async fn copy<R, W>(reader: &mut R, writer: &mut W) -> Result<usize>
26where
27    R: AsyncRead + Unpin,
28    W: AsyncWrite + Unpin,
29{
30    const BUF_SIZE: usize = 32 * 1024;
31    let mut buffer = [0u8; BUF_SIZE];
32    let n = copy_buffer(reader, writer, &mut buffer).await?;
33    Ok(n)
34}