1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
use tokio::io::{self, AsyncBufRead, AsyncWrite, AsyncWriteExt};
use crate::{
request::{self, Request},
response::Response,
};
#[derive(Debug)]
pub struct Client<R, W> {
reader: R,
writer: W,
buf: Vec<u8>,
line: Vec<u8>,
}
impl<R, W> Client<R, W> {
pub fn new(reader: R, writer: W) -> Self {
Self {
reader,
writer,
buf: Vec::new(),
line: Vec::new(),
}
}
}
impl<R: AsyncBufRead + Unpin, W: AsyncWrite + Unpin> Client<R, W> {
pub async fn read_request(&mut self) -> Result<Option<Request>, request::Error> {
Request::parse(&mut self.reader, &mut self.buf, &mut self.line).await
}
pub async fn send_response(&mut self, response: Response) -> Result<(), io::Error> {
response.serialize(&mut self.writer).await?;
self.writer.flush().await?;
Ok(())
}
}
|