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
53
54
55
56
57
58
59
60
61
62
63
64
65
pub trait Writer {
    fn write_byte(&mut self, byte: u8);
    fn write_bytes(&mut self, bytes: Vec<u8>);
}

pub struct VecWriter<'a> {
    pub output: &'a mut Vec<u8>
}

impl<'a> Writer for VecWriter<'a> {
    fn write_byte(&mut self, byte: u8) {
        self.write_bytes(vec![byte])
    }

    fn write_bytes(&mut self, mut bytes: Vec<u8>) {
        self.output.append(&mut bytes)
    }
}

pub trait Reader {
    fn read_byte(&mut self) -> u8;
    fn skip_byte(&mut self);
    fn peek_byte(&mut self) -> u8;
    fn read_n_bytes(&mut self, n: usize) -> Vec<u8>;
}

pub struct VecReader {
    pub input: Vec<u8>
}

impl Reader for VecReader {
    fn read_byte(&mut self) -> u8 {
        match self.input.clone().split_first() {
            Some((byte, rest)) => {
                self.input = rest.to_vec();
                *byte
            }
            None => 0
        }
    }

    fn skip_byte(&mut self) {
        let input = self.input.clone();
        match input.split_first() {
            Some((_, rest)) => {
                self.input = rest.to_vec();
            }
            None => ()
        };
    }

    fn peek_byte(&mut self) -> u8 {
        match self.input.first() {
            Some(byte) => *byte,
            None => 0
        }
    }

    fn read_n_bytes(&mut self, n: usize) -> Vec<u8> {
        let input = self.input.clone();
        let (bytes, rest) = input.split_at(n);
        self.input = rest.to_vec();
        bytes.to_vec()
    }
}