use bytes::{Buf, BufMut, BytesMut};
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::TcpStream;
use crate::error::Result;
use crate::parser::Frame;
pub struct Connection {
stream: TcpStream,
read_buf: BytesMut,
write_buf: BytesMut,
}
impl Connection {
pub fn new(stream: TcpStream) -> Self {
Self {
stream,
read_buf: BytesMut::with_capacity(4086),
write_buf: BytesMut::with_capacity(4096),
}
}
pub async fn read_frame(&mut self) -> Result<Option<Frame>> {
loop {
if let Some((frame, n)) = Frame::parse(&self.read_buf)? {
self.read_buf.advance(n);
return Ok(Some(frame));
}
let n = self.stream.read_buf(&mut self.read_buf).await?;
if n == 0 {
return Ok(None); }
}
}
pub fn write_frame(&mut self, frame: &Frame) {
self.write_buf.put(frame.serialize());
}
pub async fn flush(&mut self) -> Result<()> {
self.stream.write_all(&self.write_buf).await?;
self.write_buf.clear();
Ok(())
}
}