genio 0.2.1

A type safe, low level replacement for `std::io`. Supports `no_std` for embedded development, just disable cargo feature `std`. Because of limitations of `std::io::Error` type, `genio` provides `Read` and `Write` traits that allow implementors to choose their own type. This type can be better at expressing what kinds of error can happen.
Documentation
use Read;
use void::Void;

/// Reader repeating a sequence of bytes infinitely.
pub struct RepeatBytes<B> {
    bytes: B,
    offset: usize,
}

impl<B: AsRef<[u8]>> Read for RepeatBytes<B> {
    type ReadError = Void;
    
    fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::ReadError> {
        use ::core::cmp::min;
        let len = buf.len();
        let bytes = self.bytes.as_ref();

        let amt = min(buf.len(), bytes.len() - self.offset);
        buf[..amt].copy_from_slice(&bytes[self.offset..(self.offset)]);
        self.offset += amt;
        if self.offset == bytes.len() {
            self.offset = 0
        }

        let buf = { let tmp = &mut buf[amt..]; tmp };

        for chunk in buf.chunks_mut(bytes.len()) {
            if chunk.len() != bytes.len() {
                chunk.copy_from_slice(&bytes[..bytes.len()]);
                self.offset = chunk.len();
            } else {
                chunk.copy_from_slice(bytes);
            }
        }
        Ok(len)
    }
}