use serde::Deserialize; use tokio::io::{self, AsyncReadExt, ReadHalf}; use tokio::net::UnixStream; pub(crate) struct Reader { stream: ReadHalf, } impl From> for Reader { fn from(stream: ReadHalf) -> Self { Self { stream } } } impl Reader { pub async fn read Deserialize<'a>>(&mut self) -> Result { let mut buffer = [0; 2048]; match self.stream.read(&mut buffer).await { Ok(0) => Err(io::Error::new( io::ErrorKind::ConnectionAborted, "Peer disconnected", )), Ok(bytes_read) => { let data = serde_json::from_slice::(&buffer[..bytes_read])?; Ok(data) } Err(err) => Err(err), } } pub async fn read_multiple Deserialize<'a>>(&mut self) -> Result, io::Error> { let mut buffer = [0; 2048]; match self.stream.read(&mut buffer).await { Ok(0) => Err(io::Error::new( io::ErrorKind::ConnectionAborted, "Peer disconnected", )), Ok(bytes_read) => { let response_str = String::from_utf8_lossy(&buffer[..bytes_read]); let responses: Vec<&str> = response_str.split("\n\n").collect(); let responses = responses .iter() .filter_map(|r| { if !r.is_empty() { serde_json::from_str(r).ok() } else { None } }) .collect::>(); Ok(responses) } Err(err) => Err(err), } } }