use {
crate::protocol::jsonrpc::Message,
smol::io::{
AsyncBufReadExt,
AsyncWriteExt,
},
std::io,
};
pub async fn read_message<R>(r: &mut R) -> io::Result<Option<Message>>
where
R: AsyncBufReadExt + Unpin,
{
let mut line = String::new();
loop {
line.clear();
let n = r.read_line(&mut line).await?;
if n == 0 {
return Ok(None);
}
let trimmed = line.trim_end_matches(['\r', '\n']);
if trimmed.is_empty() {
continue;
}
return serde_json::from_str(trimmed)
.map(Some)
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e));
}
}
pub async fn write_message<W>(w: &mut W, msg: &Message) -> io::Result<()>
where
W: AsyncWriteExt + Unpin,
{
let text = serde_json::to_string(msg)?;
w.write_all(text.as_bytes()).await?;
w.write_all(b"\n").await?;
w.flush().await
}