1pub struct Writer {
2 buffer: Vec<u8>,
3 pos: usize,
4}
5
6impl Writer {
7 pub const INSTRUMENT_FILE_SIZE : usize = 357;
9 pub const INSTRUMENT_FILE_SIZE_WITH_EQ : usize = 375;
10
11 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 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}