1use crate::parsers::Reader;
2use alloc::{
3 string::{String, ToString},
4 vec::Vec,
5};
6use core::cell::RefCell;
7use half::f16;
8use pbf::bit_cast::BitCast;
9
10const MAX_VARINT_LENGTH: usize = u64::BITS as usize * 8 / 7 + 1;
11const BIT_SHIFT: [u64; 10] = [0, 7, 14, 21, 28, 35, 42, 49, 56, 63];
12
13#[derive(Debug, Default, Clone, PartialEq)]
39pub struct Buffer {
40 buf: Vec<u8>,
41 pos: usize,
42}
43impl From<Vec<u8>> for Buffer {
44 fn from(buf: Vec<u8>) -> Buffer {
45 Buffer { buf, pos: 0 }
46 }
47}
48impl Buffer {
49 pub fn new(buf: Vec<u8>) -> Buffer {
51 Buffer { buf, pos: 0 }
52 }
53
54 pub fn buf(&self) -> &[u8] {
56 &self.buf
57 }
58
59 pub fn pos(&self) -> usize {
61 self.pos
62 }
63
64 pub fn set_pos(&mut self, pos: usize) {
66 self.pos = pos;
67 }
68
69 pub fn len(&self) -> usize {
71 self.buf.len()
72 }
73
74 pub fn is_empty(&self) -> bool {
76 self.len() == 0
77 }
78
79 pub fn get_u8(&mut self) -> u8 {
81 let value = self.get_u8_at(self.pos);
82 self.pos += 1;
83
84 value
85 }
86
87 pub fn get_u8_at(&mut self, pos: usize) -> u8 {
89 self.buf[pos]
90 }
91
92 pub fn set_u8(&mut self, value: u8) {
94 self.set_u8_at(self.pos, value);
95 self.pos += 1;
96 }
97
98 pub fn set_u8_at(&mut self, pos: usize, value: u8) {
100 if pos >= self.buf.len() {
101 self.buf.resize(pos + 1, 0);
102 }
103 self.buf[pos] = value;
104 }
105
106 pub fn get_i8(&mut self) -> i8 {
108 let value = self.get_i8_at(self.pos);
109 self.pos += 1;
110
111 value
112 }
113
114 pub fn get_i8_at(&mut self, pos: usize) -> i8 {
116 self.buf[pos] as i8
117 }
118
119 pub fn set_i8(&mut self, value: i8) {
121 self.set_i8_at(self.pos, value);
122 self.pos += 1;
123 }
124
125 pub fn set_i8_at(&mut self, pos: usize, value: i8) {
127 if pos >= self.buf.len() {
128 self.buf.resize(pos + 1, 0);
129 }
130 self.buf[pos] = value as u8;
131 }
132
133 pub fn get_i32(&mut self) -> i32 {
135 let value = self.get_i32_at(self.pos);
136 self.pos += 4;
138
139 value
140 }
141
142 pub fn get_i32_at(&mut self, pos: usize) -> i32 {
144 let bytes = &self.buf[pos..pos + 4];
146
147 i32::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
148 }
149
150 pub fn set_i32(&mut self, value: i32) {
152 self.set_i32_at(self.pos, value);
153 self.pos += 4;
154 }
155
156 pub fn set_i32_at(&mut self, pos: usize, value: i32) {
158 if pos >= self.buf.len() {
160 self.buf.resize(pos + 4, 0);
161 }
162 let bytes = &mut self.buf[pos..pos + 4];
163
164 bytes.copy_from_slice(&value.to_le_bytes());
165 }
166
167 pub fn get_u16(&mut self) -> u16 {
169 let value = self.get_u16_at(self.pos);
170 self.pos += 2;
172
173 value
174 }
175
176 pub fn get_u16_at(&mut self, pos: usize) -> u16 {
178 let bytes = &self.buf[pos..pos + 2];
180
181 u16::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
182 }
183
184 pub fn set_u16(&mut self, value: u16) {
186 self.set_u16_at(self.pos, value);
187 self.pos += 2;
188 }
189
190 pub fn set_u16_at(&mut self, pos: usize, value: u16) {
192 if pos >= self.buf.len() {
194 self.buf.resize(pos + 2, 0);
195 }
196 let bytes = &mut self.buf[pos..pos + 2];
197
198 bytes.copy_from_slice(&value.to_le_bytes());
199 }
200
201 pub fn get_i16(&mut self) -> i16 {
203 let value = self.get_i16_at(self.pos);
204 self.pos += 2;
206
207 value
208 }
209
210 pub fn get_i16_at(&mut self, pos: usize) -> i16 {
212 let bytes = &self.buf[pos..pos + 2];
214
215 i16::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
216 }
217
218 pub fn set_i16(&mut self, value: i16) {
220 self.set_i16_at(self.pos, value);
221 self.pos += 2;
222 }
223
224 pub fn set_i16_at(&mut self, pos: usize, value: i16) {
226 if pos >= self.buf.len() {
228 self.buf.resize(pos + 2, 0);
229 }
230 let bytes = &mut self.buf[pos..pos + 2];
231
232 bytes.copy_from_slice(&value.to_le_bytes());
233 }
234
235 pub fn get_u32(&mut self) -> u32 {
237 let value = self.get_u32_at(self.pos);
238 self.pos += 4;
240
241 value
242 }
243
244 pub fn get_u32_at(&mut self, pos: usize) -> u32 {
246 let bytes = &self.buf[pos..pos + 4];
248
249 u32::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
250 }
251
252 pub fn set_u32(&mut self, value: u32) {
254 self.set_u32_at(self.pos, value);
255 self.pos += 4;
256 }
257
258 pub fn set_u32_at(&mut self, pos: usize, value: u32) {
260 if pos >= self.buf.len() {
262 self.buf.resize(pos + 4, 0);
263 }
264 let bytes = &mut self.buf[pos..pos + 4];
265
266 bytes.copy_from_slice(&value.to_le_bytes());
267 }
268
269 pub fn get_f32(&mut self) -> f32 {
271 let value = self.get_u32_at(self.pos);
272 self.pos += 4;
273 f32::from_bits(value)
274 }
275
276 pub fn get_f32_at(&mut self, pos: usize) -> f32 {
278 let value = self.get_u32_at(pos);
279 f32::from_bits(value)
280 }
281
282 pub fn set_f32(&mut self, value: f32) {
284 self.set_u32_at(self.pos, value.to_bits());
285 }
286
287 pub fn set_f32_at(&mut self, pos: usize, value: f32) {
289 self.set_u32_at(pos, value.to_bits());
290 }
291
292 pub fn get_i64(&mut self) -> i64 {
294 let value = self.get_i64_at(self.pos);
295 self.pos += 8;
297
298 value
299 }
300
301 pub fn get_i64_at(&mut self, pos: usize) -> i64 {
303 let bytes = &self.buf[pos..pos + 8];
305
306 i64::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
307 }
308
309 pub fn set_i64(&mut self, value: i64) {
311 self.set_i64_at(self.pos, value);
312 self.pos += 8;
313 }
314
315 pub fn set_i64_at(&mut self, pos: usize, value: i64) {
317 if pos >= self.buf.len() {
319 self.buf.resize(pos + 8, 0);
320 }
321 let bytes = &mut self.buf[pos..pos + 8];
322
323 bytes.copy_from_slice(&value.to_le_bytes());
324 }
325
326 pub fn get_u64(&mut self) -> u64 {
328 let value = self.get_u64_at(self.pos);
329 self.pos += 8;
331
332 value
333 }
334
335 pub fn get_u64_at(&mut self, pos: usize) -> u64 {
337 let bytes = &self.buf[pos..pos + 8];
339
340 u64::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
341 }
342
343 pub fn set_u64(&mut self, value: u64) {
345 self.set_u64_at(self.pos, value);
346 self.pos += 8;
347 }
348
349 pub fn set_u64_at(&mut self, pos: usize, value: u64) {
351 if pos >= self.buf.len() {
353 self.buf.resize(pos + 8, 0);
354 }
355 let bytes = &mut self.buf[pos..pos + 8];
356
357 bytes.copy_from_slice(&value.to_le_bytes());
358 }
359
360 pub fn get_f64(&mut self) -> f64 {
362 let value = self.get_u64_at(self.pos);
363 self.pos += 8;
364 f64::from_bits(value)
365 }
366
367 pub fn get_f64_at(&mut self, pos: usize) -> f64 {
369 let bytes = &self.buf[pos..pos + 8];
371
372 f64::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
373 }
374
375 pub fn set_f64(&mut self, value: f64) {
377 self.set_f64_at(self.pos, value);
378 }
379
380 pub fn set_f64_at(&mut self, pos: usize, value: f64) {
382 if pos >= self.buf.len() {
384 self.buf.resize(pos + 8, 0);
385 }
386 let bytes = &mut self.buf[pos..pos + 8];
387
388 bytes.copy_from_slice(&value.to_le_bytes());
389 }
390
391 pub fn decode_varint(&mut self) -> u64 {
393 if self.pos >= self.buf.len() {
394 unreachable!();
395 }
396 let mut val: u64 = 0;
397
398 for (n, shift) in BIT_SHIFT.iter().enumerate().take(MAX_VARINT_LENGTH) {
399 let b = self.buf[self.pos] as u64;
400 self.pos += 1;
401 if n == 0 {
402 if b & 0x80 == 0 {
403 return b;
404 }
405 val = b & 0x7f;
406 } else {
407 val |= (b & 0x7f) << shift;
408 }
409 if b < 0x80 {
410 break;
411 }
412 }
413
414 val
415 }
416
417 pub fn read_varint<T>(&mut self) -> T
419 where
420 T: BitCast,
421 {
422 let val = self.decode_varint();
423 T::from_u64(val)
424 }
425
426 pub fn write_varint<T>(&mut self, val: T)
428 where
429 T: BitCast,
430 {
431 let mut val = val.to_u64();
432
433 while val >= 0x80 {
434 self.buf.push(((val & 0x7f) | 0x80) as u8);
435 val >>= 7;
436 }
437 self.buf.push(val as u8);
438 }
439
440 pub fn take(&mut self) -> Vec<u8> {
442 core::mem::take(&mut self.buf)
443 }
444
445 pub fn copy_from_slice(&mut self, offset: usize, slice: &[u8]) {
447 if offset + slice.len() > self.buf.len() {
448 self.buf.resize(offset + slice.len(), 0);
449 }
450 self.buf[offset..offset + slice.len()].copy_from_slice(slice);
451 }
452}
453
454#[derive(Default, Debug, Clone, PartialEq)]
458pub struct BufferReader {
459 pub buffer: Vec<u8>, cursor: RefCell<u64>,
462}
463impl BufferReader {
464 pub fn new(buffer: Vec<u8>) -> Self {
466 Self { buffer, cursor: 0.into() }
467 }
468}
469impl BufferReader {
470 fn get_bytes(&self, byte_offset: Option<u64>, byte_length: usize) -> &[u8] {
471 let offset = byte_offset.unwrap_or(*self.cursor.borrow()) as usize;
472 assert!(offset + byte_length <= self.buffer.len());
473
474 let bytes = &self.buffer[offset..offset + byte_length];
475 *self.cursor.borrow_mut() = (offset + byte_length) as u64;
476 bytes
477 }
478}
479impl Reader for BufferReader {
480 fn len(&self) -> u64 {
481 self.buffer.len() as u64
482 }
483
484 fn uint64(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> u64 {
487 if little_endian.unwrap_or(false) {
488 self.uint64_le(byte_offset)
489 } else {
490 self.uint64_be(byte_offset)
491 }
492 }
493 fn uint64_be(&self, byte_offset: Option<u64>) -> u64 {
494 let bytes = self.get_bytes(byte_offset, 8);
495 u64::from_be_bytes(bytes.try_into().expect("Failed to read 8 bytes"))
496 }
497 fn uint64_le(&self, byte_offset: Option<u64>) -> u64 {
498 let bytes = self.get_bytes(byte_offset, 8);
499 u64::from_le_bytes(bytes.try_into().expect("Failed to read 8 bytes"))
500 }
501
502 fn int64(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> i64 {
503 if little_endian.unwrap_or(false) {
504 self.int64_le(byte_offset)
505 } else {
506 self.int64_be(byte_offset)
507 }
508 }
509 fn int64_be(&self, byte_offset: Option<u64>) -> i64 {
510 let bytes = self.get_bytes(byte_offset, 8);
511 i64::from_be_bytes(bytes.try_into().expect("Failed to read 8 bytes"))
512 }
513 fn int64_le(&self, byte_offset: Option<u64>) -> i64 {
514 let bytes = self.get_bytes(byte_offset, 8);
515 i64::from_le_bytes(bytes.try_into().expect("Failed to read 8 bytes"))
516 }
517
518 fn f64(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> f64 {
519 if little_endian.unwrap_or(false) {
520 self.f64_le(byte_offset)
521 } else {
522 self.f64_be(byte_offset)
523 }
524 }
525 fn f64_be(&self, byte_offset: Option<u64>) -> f64 {
526 let bytes = self.get_bytes(byte_offset, 8);
527 f64::from_be_bytes(bytes.try_into().expect("Failed to read 8 bytes"))
528 }
529 fn f64_le(&self, byte_offset: Option<u64>) -> f64 {
530 let bytes = self.get_bytes(byte_offset, 8);
531 f64::from_le_bytes(bytes.try_into().expect("Failed to read 8 bytes"))
532 }
533
534 fn uint32(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> u32 {
535 if little_endian.unwrap_or(false) {
536 self.uint32_le(byte_offset)
537 } else {
538 self.uint32_be(byte_offset)
539 }
540 }
541 fn uint32_be(&self, byte_offset: Option<u64>) -> u32 {
542 let bytes = self.get_bytes(byte_offset, 4);
543 u32::from_be_bytes(bytes.try_into().expect("Failed to read 4 bytes"))
544 }
545 fn uint32_le(&self, byte_offset: Option<u64>) -> u32 {
546 let bytes = self.get_bytes(byte_offset, 4);
547 u32::from_le_bytes(bytes.try_into().expect("Failed to read 4 bytes"))
548 }
549
550 fn int32(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> i32 {
551 if little_endian.unwrap_or(false) {
552 self.int32_le(byte_offset)
553 } else {
554 self.int32_be(byte_offset)
555 }
556 }
557 fn int32_be(&self, byte_offset: Option<u64>) -> i32 {
558 let bytes = self.get_bytes(byte_offset, 4);
559 i32::from_be_bytes(bytes.try_into().expect("Failed to read 4 bytes"))
560 }
561 fn int32_le(&self, byte_offset: Option<u64>) -> i32 {
562 let bytes = self.get_bytes(byte_offset, 4);
563 i32::from_le_bytes(bytes.try_into().expect("Failed to read 4 bytes"))
564 }
565
566 fn f32(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> f32 {
567 if little_endian.unwrap_or(false) {
568 self.f32_le(byte_offset)
569 } else {
570 self.f32_be(byte_offset)
571 }
572 }
573 fn f32_be(&self, byte_offset: Option<u64>) -> f32 {
574 let bytes = self.get_bytes(byte_offset, 4);
575 f32::from_be_bytes(bytes.try_into().expect("Failed to read 4 bytes"))
576 }
577 fn f32_le(&self, byte_offset: Option<u64>) -> f32 {
578 let bytes = self.get_bytes(byte_offset, 4);
579 f32::from_le_bytes(bytes.try_into().expect("Failed to read 4 bytes"))
580 }
581
582 fn uint16(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> u16 {
583 if little_endian.unwrap_or(false) {
584 self.uint16_le(byte_offset)
585 } else {
586 self.uint16_be(byte_offset)
587 }
588 }
589 fn uint16_be(&self, byte_offset: Option<u64>) -> u16 {
590 let bytes = self.get_bytes(byte_offset, 2);
591 u16::from_be_bytes(bytes.try_into().expect("Failed to read 2 bytes"))
592 }
593 fn uint16_le(&self, byte_offset: Option<u64>) -> u16 {
594 let bytes = self.get_bytes(byte_offset, 2);
595 u16::from_le_bytes(bytes.try_into().expect("Failed to read 2 bytes"))
596 }
597
598 fn int16(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> i16 {
599 if little_endian.unwrap_or(false) {
600 self.int16_le(byte_offset)
601 } else {
602 self.int16_be(byte_offset)
603 }
604 }
605 fn int16_be(&self, byte_offset: Option<u64>) -> i16 {
606 let bytes = self.get_bytes(byte_offset, 2);
607 i16::from_be_bytes(bytes.try_into().expect("Failed to read 2 bytes"))
608 }
609 fn int16_le(&self, byte_offset: Option<u64>) -> i16 {
610 let bytes = self.get_bytes(byte_offset, 2);
611 i16::from_le_bytes(bytes.try_into().expect("Failed to read 2 bytes"))
612 }
613
614 fn f16(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> f32 {
615 if little_endian.unwrap_or(false) {
616 self.f16_le(byte_offset)
617 } else {
618 self.f16_be(byte_offset)
619 }
620 }
621 fn f16_be(&self, byte_offset: Option<u64>) -> f32 {
622 let bytes = self.get_bytes(byte_offset, 2);
623 let f = f16::from_be_bytes(bytes.try_into().expect("Failed to read 2 bytes"));
624 f32::from_bits(f.to_bits().into())
625 }
626 fn f16_le(&self, byte_offset: Option<u64>) -> f32 {
627 let bytes = self.get_bytes(byte_offset, 2);
628 let f = f16::from_le_bytes(bytes.try_into().expect("Failed to read 2 bytes"));
629 f32::from_bits(f.to_bits().into())
630 }
631
632 fn uint8(&self, byte_offset: Option<u64>) -> u8 {
633 let bytes = self.get_bytes(byte_offset, 1);
634 bytes[0]
635 }
636 fn int8(&self, byte_offset: Option<u64>) -> i8 {
637 let bytes = self.get_bytes(byte_offset, 1);
638 bytes[0] as i8
639 }
640
641 fn tell(&self) -> u64 {
644 *self.cursor.borrow()
645 }
646 fn seek(&self, pos: u64) {
647 *self.cursor.borrow_mut() = pos;
648 }
649 fn slice(&self, begin: Option<u64>, end: Option<u64>) -> Vec<u8> {
650 let begin = begin.unwrap_or(*self.cursor.borrow()) as usize;
651 let end = end.unwrap_or(self.buffer.len() as u64) as usize;
652 assert!(end <= self.buffer.len());
653 self.buffer[begin..end].to_vec()
654 }
655 fn seek_slice(&self, size: usize) -> Vec<u8> {
656 let size = size as u64;
657 assert!(*self.cursor.borrow() + size <= self.buffer.len() as u64);
658 *self.cursor.borrow_mut() += size;
659 let cursor = *self.cursor.borrow();
660 self.slice(Some(cursor - size), Some(cursor))
661 }
662 fn parse_string(&self, byte_offset: Option<u64>, byte_length: Option<u64>) -> String {
663 let offset = byte_offset.unwrap_or(*self.cursor.borrow()) as usize;
664 let length = byte_length.unwrap_or((self.buffer.len() - offset) as u64) as usize;
665 let str_buf = &self.buffer[offset..offset + length];
666 let cleaned_str_buf: Vec<u8> = str_buf.iter().cloned().filter(|&b| b != 0).collect();
668 let string = String::from_utf8_lossy(&cleaned_str_buf).to_string();
669 *self.cursor.borrow_mut() = (offset + length) as u64;
670 string
671 }
672}
673impl<const N: usize> From<&[u8; N]> for BufferReader {
674 fn from(buffer: &[u8; N]) -> Self {
675 BufferReader::new(buffer.into()) }
677}
678impl From<&[u8]> for BufferReader {
679 fn from(buffer: &[u8]) -> Self {
680 BufferReader::new(buffer.into()) }
682}
683impl From<Vec<u8>> for BufferReader {
684 fn from(buffer: Vec<u8>) -> Self {
685 BufferReader::new(buffer) }
687}