Skip to main content

new_vdf_parser/
writer.rs

1trait HasByteConvert {
2  fn to_le_bytes(bytes: &mut Vec<u8>, data: Self, offset: usize) -> u8;
3  fn to_be_bytes(bytes: &mut Vec<u8>, data: Self, offset: usize) -> u8;
4}
5
6impl HasByteConvert for u8 {
7  fn to_le_bytes(bytes: &mut Vec<u8>, data: u8, offset: usize) -> u8 {
8    bytes[offset] = data;
9    return 1;
10  }
11  fn to_be_bytes(bytes: &mut Vec<u8>, data: u8, offset: usize) -> u8 {
12    bytes[offset] = data;
13    return 1;
14  }
15}
16
17impl HasByteConvert for u16 {
18  fn to_le_bytes(bytes: &mut Vec<u8>, data: u16, offset: usize) -> u8 {
19    let u8_arr = data.to_le_bytes();
20    bytes[offset] = u8_arr[0];
21    bytes[offset+1] = u8_arr[1];
22    return 2;
23  }
24  fn to_be_bytes(bytes: &mut Vec<u8>, data: u16, offset: usize) -> u8 {
25    let u8_arr = data.to_be_bytes();
26    bytes[offset] = u8_arr[0];
27    bytes[offset+1] = u8_arr[1];
28    return 2;
29  }
30}
31
32impl HasByteConvert for u32 {
33  fn to_le_bytes(bytes: &mut Vec<u8>, data: u32, offset: usize) -> u8 {
34    let u8_arr = data.to_le_bytes();
35    bytes[offset] = u8_arr[0];
36    bytes[offset+1] = u8_arr[1];
37    bytes[offset+2] = u8_arr[2];
38    bytes[offset+3] = u8_arr[3];
39    return 4;
40  }
41  fn to_be_bytes(bytes: &mut Vec<u8>, data: u32, offset: usize) -> u8 {
42    let u8_arr = data.to_be_bytes();
43    bytes[offset] = u8_arr[0];
44    bytes[offset+1] = u8_arr[1];
45    bytes[offset+2] = u8_arr[2];
46    bytes[offset+3] = u8_arr[3];
47    return 4;
48  }
49}
50
51impl HasByteConvert for u64 {
52  fn to_le_bytes(bytes: &mut Vec<u8>, data: u64, offset: usize) -> u8 {
53    let u8_arr = data.to_le_bytes();
54    bytes[offset] = u8_arr[0];
55    bytes[offset+1] = u8_arr[1];
56    bytes[offset+2] = u8_arr[2];
57    bytes[offset+3] = u8_arr[3];
58    bytes[offset+4] = u8_arr[4];
59    bytes[offset+5] = u8_arr[5];
60    bytes[offset+6] = u8_arr[6];
61    bytes[offset+7] = u8_arr[7];
62    return 8;
63  }
64  fn to_be_bytes(bytes: &mut Vec<u8>, data: u64, offset: usize) -> u8 {
65    let u8_arr = data.to_be_bytes();
66    bytes[offset] = u8_arr[0];
67    bytes[offset+1] = u8_arr[1];
68    bytes[offset+2] = u8_arr[2];
69    bytes[offset+3] = u8_arr[3];
70    bytes[offset+4] = u8_arr[4];
71    bytes[offset+5] = u8_arr[5];
72    bytes[offset+6] = u8_arr[6];
73    bytes[offset+7] = u8_arr[7];
74    return 8;
75  }
76}
77
78impl HasByteConvert for i8 {
79  fn to_le_bytes(bytes: &mut Vec<u8>, data: i8, offset: usize) -> u8 {
80    bytes[offset] = data.to_le_bytes()[0];
81    return 1;
82  }
83  fn to_be_bytes(bytes: &mut Vec<u8>, data: i8, offset: usize) -> u8 {
84    bytes[offset] = data.to_be_bytes()[0];
85    return 1;
86  }
87}
88
89impl HasByteConvert for i16 {
90  fn to_le_bytes(bytes: &mut Vec<u8>, data: i16, offset: usize) -> u8 {
91    let u8_arr = data.to_le_bytes();
92    bytes[offset] = u8_arr[0];
93    bytes[offset+1] = u8_arr[1];
94    return 2;
95  }
96  fn to_be_bytes(bytes: &mut Vec<u8>, data: i16, offset: usize) -> u8 {
97    let u8_arr = data.to_be_bytes();
98    bytes[offset] = u8_arr[0];
99    bytes[offset+1] = u8_arr[1];
100    return 2;
101  }
102}
103
104impl HasByteConvert for i32 {
105  fn to_le_bytes(bytes: &mut Vec<u8>, data: i32, offset: usize) -> u8 {
106    let u8_arr = data.to_le_bytes();
107    bytes[offset] = u8_arr[0];
108    bytes[offset+1] = u8_arr[1];
109    bytes[offset+2] = u8_arr[2];
110    bytes[offset+3] = u8_arr[3];
111    return 4;
112  }
113  fn to_be_bytes(bytes: &mut Vec<u8>, data: i32, offset: usize) -> u8 {
114    let u8_arr = data.to_be_bytes();
115    bytes[offset] = u8_arr[0];
116    bytes[offset+1] = u8_arr[1];
117    bytes[offset+2] = u8_arr[2];
118    bytes[offset+3] = u8_arr[3];
119    return 4;
120  }
121}
122
123impl HasByteConvert for i64 {
124  fn to_le_bytes(bytes: &mut Vec<u8>, data: i64, offset: usize) -> u8 {
125    let u8_arr = data.to_le_bytes();
126    bytes[offset] = u8_arr[0];
127    bytes[offset+1] = u8_arr[1];
128    bytes[offset+2] = u8_arr[2];
129    bytes[offset+3] = u8_arr[3];
130    bytes[offset+4] = u8_arr[4];
131    bytes[offset+5] = u8_arr[5];
132    bytes[offset+6] = u8_arr[6];
133    bytes[offset+7] = u8_arr[7];
134    return 8;
135  }
136  fn to_be_bytes(bytes: &mut Vec<u8>, data: i64, offset: usize) -> u8 {
137    let u8_arr = data.to_be_bytes();
138    bytes[offset] = u8_arr[0];
139    bytes[offset+1] = u8_arr[1];
140    bytes[offset+2] = u8_arr[2];
141    bytes[offset+3] = u8_arr[3];
142    bytes[offset+4] = u8_arr[4];
143    bytes[offset+5] = u8_arr[5];
144    bytes[offset+6] = u8_arr[6];
145    bytes[offset+7] = u8_arr[7];
146    return 8;
147  }
148}
149
150impl HasByteConvert for f32 {
151  fn to_le_bytes(bytes: &mut Vec<u8>, data: f32, offset: usize) -> u8 {
152    let u8_arr = data.to_le_bytes();
153    bytes[offset] = u8_arr[0];
154    bytes[offset+1] = u8_arr[1];
155    bytes[offset+2] = u8_arr[2];
156    bytes[offset+3] = u8_arr[3];
157    return 4;
158  }
159  fn to_be_bytes(bytes: &mut Vec<u8>, data: f32, offset: usize) -> u8 {
160    let u8_arr = data.to_be_bytes();
161    bytes[offset] = u8_arr[0];
162    bytes[offset+1] = u8_arr[1];
163    bytes[offset+2] = u8_arr[2];
164    bytes[offset+3] = u8_arr[3];
165    return 4;
166  }
167}
168
169impl HasByteConvert for f64 {
170  fn to_le_bytes(bytes: &mut Vec<u8>, data: f64, offset: usize) -> u8 {
171    let u8_arr = data.to_le_bytes();
172    bytes[offset] = u8_arr[0];
173    bytes[offset+1] = u8_arr[1];
174    bytes[offset+2] = u8_arr[2];
175    bytes[offset+3] = u8_arr[3];
176    bytes[offset+4] = u8_arr[4];
177    bytes[offset+5] = u8_arr[5];
178    bytes[offset+6] = u8_arr[6];
179    bytes[offset+7] = u8_arr[7];
180    return 8;
181  }
182  fn to_be_bytes(bytes: &mut Vec<u8>, data: f64, offset: usize) -> u8 {
183    let u8_arr = data.to_be_bytes();
184    bytes[offset] = u8_arr[0];
185    bytes[offset+1] = u8_arr[1];
186    bytes[offset+2] = u8_arr[2];
187    bytes[offset+3] = u8_arr[3];
188    bytes[offset+4] = u8_arr[4];
189    bytes[offset+5] = u8_arr[5];
190    bytes[offset+6] = u8_arr[6];
191    bytes[offset+7] = u8_arr[7];
192    return 8;
193  }
194}
195
196pub struct Writer<'a> {
197  data: &'a mut Vec<u8>,
198  offset: usize,
199}
200
201#[allow(dead_code)]
202impl Writer<'_> {
203  /// Gets the underlying data of the writer.
204  pub fn get_data(&self) -> &[u8] { return &self.data[..]; }
205  /// Gets the offset of the writer.
206  pub fn get_offset(&self) -> usize { return self.offset; }
207
208  /// Creates a new Writer from the provided buffer.
209  pub fn new(buf: &mut Vec<u8>) -> Writer<'_> { return Writer { data: buf, offset: 0 }; }
210
211  /// Seek to a new offset, from 0 (start), 1 (current), or 2 (end) of the buffer.
212  pub fn seek(&mut self, offset: usize, position: u8) {
213    if position == 0 {
214      self.offset = offset;
215    } else if position == 1 {
216      self.offset += offset;
217    } else {
218      self.offset = (self.data.len() as usize) - offset;
219    }
220  }
221  
222  /// Expands the capacity of the underlying buffer.
223  fn expand_capacity(&mut self) {
224    self.data.resize(self.data.len() * 2, 0);
225  }
226
227  /// Data writing interface.
228  fn write_i<T: HasByteConvert>(&mut self, data: T, length: u8, endianness: bool) -> u8 {
229    if self.remaining() <= length.into() {
230      self.expand_capacity()
231    }
232
233    if endianness {
234      return T::to_le_bytes(self.data, data, self.offset);
235    } else {
236      return T::to_be_bytes(self.data, data, self.offset);
237    }
238  }
239
240  /// Trims any excess bytes from the underlying buffer.
241  pub fn trim(&mut self) {
242    self.data.truncate(self.offset);
243  }
244
245  /// Gets the remaining length of the buffer.
246  pub fn remaining(&mut self) -> usize {
247    return self.data.len() - (self.offset + 1);
248  }
249  
250  /// Writes an 8 bit unsigned int to the buffer.
251  pub fn write_uint8(&mut self, data: u8, endianness: bool) -> u8 {
252    let res = self.write_i::<u8>(data, 1, endianness);
253    self.offset += 1;
254    return res;
255  }
256  /// Writes a 16 bit unsigned int to the buffer.
257  pub fn write_uint16(&mut self, data: u16, endianness: bool) -> u8 {
258    let res = self.write_i::<u16>(data, 2, endianness);
259    self.offset += 2;
260    return res;
261  }
262  /// Writes a 32 bit unsigned int to the buffer.
263  pub fn write_uint32(&mut self, data: u32, endianness: bool) -> u8 {
264    let res = self.write_i::<u32>(data, 4, endianness);
265    self.offset += 4;
266    return res;
267  }
268  /// Writes a 64 bit unsigned int to the buffer.
269  pub fn write_uint64(&mut self, data: u64, endianness: bool) -> u8 {
270    let res = self.write_i::<u64>(data, 8, endianness);
271    self.offset += 8;
272    return res;
273  }
274  
275  /// Writes an 8 bit signed int to the buffer.
276  pub fn write_int8(&mut self, data: i8, endianness: bool) -> u8 {
277    let res = self.write_i::<i8>(data, 1, endianness);
278    self.offset += 1;
279    return res;
280  }
281  /// Writes a 16 bit signed int to the buffer.
282  pub fn write_int16(&mut self, data: i16, endianness: bool) -> u8 {
283    let res = self.write_i::<i16>(data, 2, endianness);
284    self.offset += 2;
285    return res;
286  }
287  /// Writes a 32 bit signed int to the buffer.
288  pub fn write_int32(&mut self, data: i32, endianness: bool) -> u8 {
289    let res = self.write_i::<i32>(data, 4, endianness);
290    self.offset += 4;
291    return res;
292  }
293  /// Writes a 64 bit signed int to the buffer.
294  pub fn write_int64(&mut self, data: i64, endianness: bool) -> u8 {
295    let res = self.write_i::<i64>(data, 8, endianness);
296    self.offset += 8;
297    return res;
298  }
299  
300  /// Writes a 32 bit float to the buffer.
301  pub fn write_float32(&mut self, data: f32, endianness: bool) -> u8 {
302    let res = self.write_i::<f32>(data, 4, endianness);
303    self.offset += 4;
304    return res;
305  }
306  /// Writes a 64 bit float to the buffer.
307  pub fn write_float64(&mut self, data: f64, endianness: bool) -> u8 {
308    let res = self.write_i::<f64>(data, 8, endianness);
309    self.offset += 8;
310    return res;
311  }
312
313  /// Writes a string to the buffer, optionally prefixing it with its length.
314  pub fn write_string(&mut self, data: String, prefix_with_length: bool, endianness: bool) -> u32 {
315    let str_bytes = data.into_bytes();
316    let str_bytes_len = str_bytes.len();
317    let mut length_to_return = str_bytes_len;
318
319    if prefix_with_length {
320      self.write_uint32(str_bytes_len as u32, endianness);
321      length_to_return += 4;
322    }
323    
324    if self.remaining() <= str_bytes_len {
325      self.expand_capacity()
326    }
327    
328    let mut i: usize = 0;
329    while i < str_bytes_len {
330      self.data[self.offset + i] = str_bytes[i];
331      i += 1;
332    }
333
334    self.data[self.offset + str_bytes_len] = 0x00;
335
336    self.offset += str_bytes_len + 1;
337
338    return length_to_return as u32;
339  }
340}