m8_file_parser/
writer.rs

1pub struct Writer {
2    buffer: Vec<u8>,
3    pos: usize,
4}
5
6impl Writer {
7    /// Initialize the writer from a loaded song
8    pub fn new(v: Vec<u8>) -> Writer {
9        Writer { buffer: v, pos: 0 }
10    }
11
12    /// Terminate writing and return the buffer
13    pub fn finish(self) -> Vec<u8> {
14        self.buffer
15    }
16
17    pub fn write(&mut self, v: u8) {
18        self.buffer[self.pos] = v;
19        self.pos += 1;
20    }
21
22    pub fn write_bytes(&mut self, bytes: &[u8]) {
23        let mut cursor = self.pos;
24        let buff = &mut self.buffer;
25
26        for b in bytes {
27            buff[cursor] = *b;
28            cursor += 1;
29        }
30
31        self.pos = cursor;
32    }
33
34    pub fn write_string(&mut self, str: &str, fill: usize) {
35        let bytes = str.as_bytes();
36        self.write_bytes(bytes);
37        self.fill_till(0, fill - bytes.len());
38    }
39
40    pub fn skip(&mut self, skip: usize) {
41        self.pos += skip
42    }
43
44    pub fn seek(&mut self, new_pos: usize) {
45        self.pos = new_pos;
46    }
47
48    pub fn pos(&self) -> usize {
49        self.pos
50    }
51
52    fn fill_till(&mut self, v: u8, until: usize) {
53        if until == 0 {
54            return;
55        }
56
57        for _i in 0..until {
58            self.buffer[self.pos] = v;
59            self.pos += 1;
60        }
61    }
62}