summaryrefslogtreecommitdiff
path: root/src/client.rs
blob: f5ed2f99ac8adcf73eaa46355a27806be8fb283d (plain)
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(())
    }
}