m8_file_parser/
writer.rs

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