diff options
Diffstat (limited to 'src/transport')
-rw-r--r-- | src/transport/mod.rs | 1 | ||||
-rw-r--r-- | src/transport/tcp.rs | 3 | ||||
-rw-r--r-- | src/transport/udp.rs | 30 |
3 files changed, 32 insertions, 2 deletions
diff --git a/src/transport/mod.rs b/src/transport/mod.rs index 3fa82df..cf49d31 100644 --- a/src/transport/mod.rs +++ b/src/transport/mod.rs @@ -2,6 +2,7 @@ use crate::encoding::{request::Request, response::Response}; use anyhow::Result; pub mod tcp; +pub mod udp; #[allow(async_fn_in_trait)] pub trait Transport { diff --git a/src/transport/tcp.rs b/src/transport/tcp.rs index f5986b9..8c0a024 100644 --- a/src/transport/tcp.rs +++ b/src/transport/tcp.rs @@ -1,3 +1,4 @@ +use super::Transport; use crate::encoding::{request::Request, response::Response}; use anyhow::{anyhow, Result}; use log::debug; @@ -11,8 +12,6 @@ use tokio::{ }, }; -use super::Transport; - pub struct TcpTransport { write: Mutex<BufWriter<OwnedWriteHalf>>, read: Mutex<Receiver<Response>>, diff --git a/src/transport/udp.rs b/src/transport/udp.rs new file mode 100644 index 0000000..c86ce50 --- /dev/null +++ b/src/transport/udp.rs @@ -0,0 +1,30 @@ +use super::Transport; +use crate::encoding::{request::Request, response::Response}; +use anyhow::Result; +use log::debug; +use std::str::FromStr; +use tokio::net::UdpSocket; + +pub struct UdpTransport { + sock: UdpSocket, +} + +impl UdpTransport { + pub async fn new(sock: UdpSocket) -> Result<Self> { + Ok(Self { sock }) + } +} +impl Transport for UdpTransport { + async fn recv(&self) -> Result<Response> { + let mut buf = [0; 1024]; + let size = self.sock.recv(&mut buf).await?; + let message = String::from_utf8(buf[..size].to_vec())?; + debug!("{message}"); + Response::from_str(message.trim_end()) + } + async fn send(&self, request: Request) -> Result<()> { + debug!("-> {request}"); + self.sock.send(format!("{request}").as_bytes()).await?; + Ok(()) + } +} |