use crate::Result;
use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt, ReadHalf, WriteHalf};
use ptrs::debug;
async fn echo_fn<'a, A, B>(mut r: ReadHalf<A>, mut w: WriteHalf<B>) -> std::io::Result<()>
where
A: AsyncRead + Unpin + 'a,
B: AsyncWrite + Unpin + 'a,
{
let _n = tokio::io::copy(&mut r, &mut w).await?;
_ = w.write(&[]).await?;
w.flush().await?;
w.shutdown().await?;
debug!("echo_fn finished");
Ok(())
}
async fn write_and_close<'a, A: AsyncWrite + Unpin + 'a>(
mut w: WriteHalf<A>,
) -> std::io::Result<usize> {
let write_me = vec![0_u8; 1024];
let mut n = 0;
for _ in 0..1024 {
n += w.write(&write_me).await?;
}
n += w.write(&[]).await?;
w.flush().await?;
assert_eq!(n, 1024 * 1024);
debug!("finished writing... sleeping 1s");
std::thread::sleep(std::time::Duration::from_millis(100));
w.shutdown().await?;
debug!("writer closed");
Ok(n)
}
async fn trash<'a, A: AsyncRead + Unpin + 'a>(mut r: ReadHalf<A>) -> Result<u64> {
let out_file = tokio::fs::File::create("/dev/null").await.unwrap();
let mut out_file = tokio::io::BufWriter::new(out_file);
let n = tokio::io::copy(&mut r, &mut out_file).await.unwrap();
debug!("trash finished");
Ok(n)
}