use crate::errors::Error;
use bytes::{Buf, BytesMut};
use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
const RESIZE: usize = 8 * 1024;
pub struct BufferedIo<'s, S> {
socket: &'s mut S,
pub buffer: &'s mut BytesMut,
}
impl<'s, S> BufferedIo<'s, S> {
pub fn new(socket: &'s mut S, buffer: &'s mut BytesMut) -> BufferedIo<'s, S> {
BufferedIo { socket, buffer }
}
pub async fn write(&mut self) -> Result<(), Error>
where
S: AsyncWrite + Unpin,
{
let BufferedIo { socket, buffer } = self;
socket.write_all(buffer).await?;
socket.flush().await?;
Ok(())
}
pub async fn read(&mut self) -> Result<usize, Error>
where
S: AsyncRead + Unpin,
{
let BufferedIo { socket, buffer } = self;
let len = buffer.len();
buffer.resize(len + RESIZE, 0);
let read_count = socket.read(&mut buffer[len..]).await?;
buffer.truncate(len + read_count);
Ok(read_count)
}
pub fn advance(&mut self, count: usize) {
self.buffer.advance(count);
}
pub fn clear(&mut self) {
self.buffer.clear();
}
}