protohackers/problem_06/src/connection.rs

82 lines
1.8 KiB
Rust
Raw Normal View History

use std::{io::Cursor, net::SocketAddr};
2023-05-06 05:41:24 +00:00
use bytes::{Buf, BytesMut};
use tokio::{
io::{AsyncReadExt, AsyncWriteExt, BufWriter},
net::TcpStream,
};
2023-05-21 15:50:33 +00:00
use tracing::info;
use crate::frame::{self, ClientFrames, ServerFrames};
pub(crate) enum ConnectionType {
Camera,
Dispatcher,
}
2023-05-06 05:41:24 +00:00
#[derive(Debug)]
pub struct Connection {
pub address: SocketAddr,
buffer: BytesMut,
pub(crate) stream: BufWriter<TcpStream>,
2023-05-06 05:41:24 +00:00
}
impl Connection {
pub fn new(address: SocketAddr, socket: TcpStream) -> Connection {
Connection {
address,
buffer: BytesMut::with_capacity(4 * 1024),
stream: BufWriter::new(socket),
}
}
2023-05-06 05:41:24 +00:00
pub fn get_address(&self) -> SocketAddr {
self.address.clone()
}
pub async fn read_frame(&mut self) -> crate::Result<Option<ClientFrames>> {
2023-05-21 15:50:33 +00:00
info!("Start read_frame");
loop {
2023-05-21 15:50:33 +00:00
info!("Looping to self.parse_frame");
if let Some(frame) = self.parse_frame()? {
2023-05-21 15:50:33 +00:00
info!("parse_frame got a result: {frame:?}");
return Ok(Some(frame));
}
2023-05-06 05:41:24 +00:00
if 0 == self.stream.read_buf(&mut self.buffer).await? {
if self.buffer.is_empty() {
return Ok(None);
} else {
return Err("connection reset by peer".into());
}
}
}
}
2023-05-06 05:41:24 +00:00
fn parse_frame(&mut self) -> crate::Result<Option<ClientFrames>> {
use frame::Error::Incomplete;
2023-05-06 05:41:24 +00:00
let mut buf = Cursor::new(&self.buffer[..]);
2023-05-06 05:41:24 +00:00
match ClientFrames::check(&mut buf) {
Ok(_) => {
let len = buf.position() as usize;
buf.set_position(0);
2023-05-06 05:41:24 +00:00
let frame = ClientFrames::parse(&mut buf)?;
self.buffer.advance(len);
2023-05-06 05:41:24 +00:00
Ok(Some(frame))
}
Err(Incomplete) => Ok(None),
Err(e) => Err(e.into()),
}
}
2023-05-06 05:41:24 +00:00
pub async fn write_frame(&mut self, frame: ServerFrames) -> tokio::io::Result<()> {
let _ = self.stream.write_all(&frame.convert_to_bytes()).await;
self.stream.flush().await?;
Ok(())
}
2023-05-06 05:41:24 +00:00
}