summaryrefslogtreecommitdiff
path: root/src/client.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/client.rs')
-rw-r--r--src/client.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/client.rs b/src/client.rs
new file mode 100644
index 0000000..f5ed2f9
--- /dev/null
+++ b/src/client.rs
@@ -0,0 +1,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(())
+ }
+}