1use futures::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
2use std::io::Result;
3use std::marker::Unpin;
4
5pub 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
24pub 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}