1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use std::io::{Read, Result, Write};

#[cfg(feature = "primitive")]
pub mod primitive;
#[cfg(feature = "variable-len")]
pub mod variable_len;
#[cfg(feature = "str")]
pub mod str;

pub trait Readable {
    fn read(&mut self) -> Result<u8>;

    fn read_more(&mut self, buf: &mut [u8]) -> Result<()> {
        for i in 0..buf.len() {
            buf[i] = self.read()?;
        }
        Ok(())
    }
}

pub trait Writable {
    fn write(&mut self, byte: u8) -> Result<()>;

    fn write_more(&mut self, bytes: &[u8]) -> Result<()> {
        for i in 0..bytes.len() {
            self.write(bytes[i])?;
        }
        Ok(())
    }
}

impl<R: Read> Readable for R {
    fn read(&mut self) -> Result<u8> {
        let mut bytes = [0; 1];
        self.read_exact(&mut bytes)?;
        Ok(bytes[0])
    }

    fn read_more(&mut self, buf: &mut [u8]) -> Result<()> {
        self.read_exact(buf)
    }
}

impl<W: Write> Writable for W {
    fn write(&mut self, byte: u8) -> Result<()> {
        self.write_all(&[byte])
    }

    fn write_more(&mut self, bytes: &[u8]) -> Result<()> {
        self.write_all(bytes)
    }
}