quad-net 0.1.1

Miniquad friendly network abstractions
Documentation
use std::io::ErrorKind;

#[derive(Debug)]
pub enum MessageReader {
    Empty,
    Amount(usize),
}

impl MessageReader {
    pub fn new() -> MessageReader {
        MessageReader::Empty
    }

    pub fn next(&mut self, mut stream: impl std::io::Read) -> Result<Option<Vec<u8>>, ()> {
        let mut bytes = [0 as u8; 255];

        match self {
            MessageReader::Empty => match stream.read_exact(&mut bytes[0..1]) {
                Ok(_) => {
                    *self = MessageReader::Amount(bytes[0] as usize);
                    Ok(None)
                }
                Err(err) if err.kind() == ErrorKind::WouldBlock => Ok(None),
                Err(_err) => Err(()),
            },
            MessageReader::Amount(len) => match stream.read_exact(&mut bytes[0..*len]) {
                Ok(_) => {
                    let msg = bytes[0..*len].to_vec();
                    *self = MessageReader::Empty;
                    Ok(Some(msg))
                }
                Err(err) if err.kind() == ErrorKind::WouldBlock => Ok(None),
                Err(_) => Err(()),
            },
        }
    }
}