use crate::Error;
use serde::Serialize;
use serde::de::DeserializeOwned;
use tokio::io::{AsyncBufRead, AsyncBufReadExt, AsyncWrite, AsyncWriteExt};
pub(crate) async fn write_json_line<W, T>(writer: &mut W, value: &T) -> Result<(), Error>
where
W: AsyncWrite + Unpin,
T: Serialize,
{
let payload = serde_json::to_string(value)?;
writer.write_all(payload.as_bytes()).await?;
writer.write_all(b"\n").await?;
writer.flush().await?;
Ok(())
}
pub(crate) async fn read_json_line<R, T>(reader: &mut R) -> Result<Option<T>, Error>
where
R: AsyncBufRead + Unpin,
T: DeserializeOwned,
{
let mut line = String::new();
let bytes = reader.read_line(&mut line).await?;
if bytes == 0 {
return Ok(None);
}
Ok(Some(serde_json::from_str(&line)?))
}