ioserverlib 0.1.2

IO messages serving library
Documentation
use std::io::{Read, Write, BufRead};

pub trait Serializer<R: Read, W: Write> {
    type Error;
    type Message;

    fn try_read(&self, reader: &mut R) -> Result<Option<Self::Message>, Self::Error>;

    fn read(&self, reader: &mut R) -> Result<Self::Message, Self::Error> {
        loop {
            if let Some(message) = self.try_read(reader)? {
                return Ok(message);
            }
        }
    }

    fn write(&self, writer: &mut W, message: Self::Message) -> Result<(), Self::Error>;
}

#[cfg(feature = "json-serializer")]
pub trait JsonSerializer {
    type Error: From<std::io::Error> + From<serde_json::Error>;
    type Message: serde::Serialize + serde::de::DeserializeOwned;
}

#[cfg(feature = "json-serializer")]
impl<R: BufRead, W: Write, S: JsonSerializer> Serializer<R, W> for S {
    type Error = S::Error;
    type Message = S::Message;

    fn try_read(&self, reader: &mut R) -> Result<Option<Self::Message>, Self::Error> {
        let mut buf = String::new();

        reader.read_line(&mut buf)?;

        let buf = buf.trim_ascii();

        if !buf.is_empty() {
            let message = serde_json::from_slice::<Self::Message>(buf.as_bytes())?;

            Ok(Some(message))
        } else {
            Ok(None)
        }
    }

    fn write(&self, writer: &mut W, message: Self::Message) -> Result<(), Self::Error> {
        let message = serde_json::to_vec(&message)?;

        writer.write_all(&message)?;
        writer.write_all(b"\n")?;
        writer.flush()?;

        Ok(())
    }
}