1#[cfg(test)]
2mod test;
3
4use std::{fs, io, marker::PhantomData, path::Path};
5
6pub trait Chivable: Sized {
9 fn chive_in(&self, chive_in: &mut ChiveIn);
12
13 fn chive_out(chive_out: &mut ChiveOut) -> Result<Self, ()>;
17}
18
19impl Chivable for () {
21 fn chive_in(&self, _chive_in: &mut ChiveIn) {
22 }
24
25 fn chive_out(_chive_out: &mut ChiveOut) -> Result<Self, ()> {
26 Ok(())
27 }
28}
29
30#[derive(PartialEq, Eq, Debug)]
32pub enum PrimitiveType {
33 Bool,
34 U8,
35 I8,
36 U16,
37 I16,
38 U32,
39 I32,
40 U64,
41 I64,
42 F32,
43 F64,
44}
45
46#[derive(PartialEq, Eq, Debug)]
48pub enum ValueType {
49 Primitive(PrimitiveType),
51
52 Array(PrimitiveType),
54
55 String,
57
58 Nest,
61}
62
63impl PrimitiveType {
64 fn to_nibble(&self) -> u8 {
66 match self {
67 PrimitiveType::Bool => 0x01,
68 PrimitiveType::U8 => 0x02,
69 PrimitiveType::I8 => 0x03,
70 PrimitiveType::U16 => 0x04,
71 PrimitiveType::I16 => 0x05,
72 PrimitiveType::U32 => 0x06,
73 PrimitiveType::I32 => 0x07,
74 PrimitiveType::U64 => 0x08,
75 PrimitiveType::I64 => 0x09,
76 PrimitiveType::F32 => 0x0A,
77 PrimitiveType::F64 => 0x0B,
78 }
79 }
80
81 fn from_nibble(byte: u8) -> Result<PrimitiveType, ()> {
83 match byte {
84 0x01 => Ok(PrimitiveType::Bool),
85 0x02 => Ok(PrimitiveType::U8),
86 0x03 => Ok(PrimitiveType::I8),
87 0x04 => Ok(PrimitiveType::U16),
88 0x05 => Ok(PrimitiveType::I16),
89 0x06 => Ok(PrimitiveType::U32),
90 0x07 => Ok(PrimitiveType::I32),
91 0x08 => Ok(PrimitiveType::U64),
92 0x09 => Ok(PrimitiveType::I64),
93 0x0A => Ok(PrimitiveType::F32),
94 0x0B => Ok(PrimitiveType::F64),
95 _ => Err(()),
96 }
97 }
98}
99
100impl ValueType {
101 fn to_byte(&self) -> u8 {
103 match self {
104 ValueType::Primitive(prim_type) => 0x00 | prim_type.to_nibble(),
105 ValueType::Array(prim_type) => 0x10 | prim_type.to_nibble(),
106 ValueType::String => 0x20,
107 ValueType::Nest => 0x30,
108 }
109 }
110
111 fn from_byte(byte: u8) -> Result<ValueType, ()> {
113 let hi_nibble = byte & 0xF0;
114 let lo_nibble = byte & 0x0F;
115 match hi_nibble {
116 0x00 => Ok(ValueType::Primitive(PrimitiveType::from_nibble(lo_nibble)?)),
117 0x10 => Ok(ValueType::Array(PrimitiveType::from_nibble(lo_nibble)?)),
118 0x20 => Ok(ValueType::String),
119 0x30 => Ok(ValueType::Nest),
120 _ => Err(()),
121 }
122 }
123}
124
125trait PrimitiveReadWrite {
127 const SIZE: usize;
129
130 const TYPE: PrimitiveType;
132
133 fn write_to(&self, data: &mut Vec<u8>);
135
136 fn read_from(data: &mut ChiveOut) -> Self;
139}
140
141macro_rules! impl_primitive_read_write {
146 ($primitive: ident, $size: literal, $typetag: expr) => {
147 impl PrimitiveReadWrite for $primitive {
148 const SIZE: usize = $size;
149 const TYPE: PrimitiveType = $typetag;
150 fn write_to(&self, data: &mut Vec<u8>) {
151 for b in self.to_be_bytes() {
152 data.push(b);
153 }
154 }
155 fn read_from(d: &mut ChiveOut) -> Self {
156 let mut bytes = Self::default().to_be_bytes();
157 for b in &mut bytes {
158 *b = d.read_byte().unwrap();
159 }
160 Self::from_be_bytes(bytes)
161 }
162 }
163 };
164}
165
166impl_primitive_read_write!(u8, 1, PrimitiveType::U8);
167impl_primitive_read_write!(i8, 1, PrimitiveType::I8);
168impl_primitive_read_write!(u16, 2, PrimitiveType::U16);
169impl_primitive_read_write!(i16, 2, PrimitiveType::I16);
170impl_primitive_read_write!(u32, 4, PrimitiveType::U32);
171impl_primitive_read_write!(i32, 4, PrimitiveType::I32);
172impl_primitive_read_write!(u64, 8, PrimitiveType::U64);
173impl_primitive_read_write!(i64, 8, PrimitiveType::I64);
174impl_primitive_read_write!(f32, 4, PrimitiveType::F32);
175impl_primitive_read_write!(f64, 8, PrimitiveType::F64);
176
177impl PrimitiveReadWrite for bool {
180 const SIZE: usize = 1;
181 const TYPE: PrimitiveType = PrimitiveType::Bool;
182
183 fn write_to(&self, data: &mut Vec<u8>) {
184 data.push(if *self { 1 } else { 0 });
185 }
186
187 fn read_from(d: &mut ChiveOut) -> bool {
188 d.read_byte().unwrap() != 0
189 }
190}
191
192pub struct Chive {
203 data: Vec<u8>,
208}
209
210impl Chive {
212 pub fn with_chive_in<F: Fn(ChiveIn)>(f: F) -> Chive {
220 let mut data = Vec::<u8>::new();
221
222 data.push(0);
223 data.push(0);
224 data.push(0);
225 data.push(0);
226
227 let chive_in = ChiveIn::new(&mut data);
228 f(chive_in);
229
230 debug_assert!(data.len() >= 4);
231 let len_bytes = (data.len() - 4) as u32;
232 let [b0, b1, b2, b3] = len_bytes.to_be_bytes();
233
234 data[0] = b0;
235 data[1] = b1;
236 data[2] = b2;
237 data[3] = b3;
238
239 Chive { data }
240 }
241
242 pub fn chive_out<'a>(&'a self) -> Result<ChiveOut<'a>, ()> {
245 if self.data.len() < 4 {
246 return Err(());
247 }
248 let len =
249 u32::from_be_bytes([self.data[0], self.data[1], self.data[2], self.data[3]]) as usize;
250 let slice = &self.data[4..];
251 if len != slice.len() {
252 return Err(());
253 }
254 Ok(ChiveOut {
255 data: slice,
256 position: 0,
257 })
258 }
259
260 pub fn dump_to_file(&self, path: &Path) -> Result<(), io::Error> {
262 fs::write(path, &self.data)?;
264 Ok(())
265 }
266
267 pub fn load_from_file(path: &Path) -> Result<Chive, io::Error> {
270 let data = fs::read(path)?;
272 Ok(Chive { data })
273 }
274
275 pub fn into_vec(self) -> Vec<u8> {
277 self.data
278 }
279
280 pub fn from_vec(data: Vec<u8>) -> Chive {
283 Chive { data }
284 }
285}
286
287pub struct ChiveIn<'a> {
289 data: &'a mut Vec<u8>,
292}
293
294impl<'a> ChiveIn<'a> {
296 fn new(data: &'a mut Vec<u8>) -> ChiveIn<'a> {
298 ChiveIn { data }
299 }
300
301 fn write_primitive<T: PrimitiveReadWrite>(&mut self, x: T) {
303 self.data.reserve(u8::SIZE + T::SIZE);
304 self.data.push(ValueType::Primitive(T::TYPE).to_byte());
305 x.write_to(self.data);
306 }
307
308 fn write_primitive_array_slice<T: PrimitiveReadWrite>(&mut self, x: &[T]) {
310 self.data
311 .reserve(u8::SIZE + u32::SIZE + (x.len() * T::SIZE));
312 self.data.push(ValueType::Array(T::TYPE).to_byte());
313 let len = x.len() as u32;
314 len.write_to(self.data);
315 for xi in x {
316 xi.write_to(self.data);
317 }
318 }
319
320 fn write_primitive_array_iter<I: Iterator>(&mut self, mut it: I)
322 where
323 I::Item: PrimitiveReadWrite,
324 {
325 self.data.push(ValueType::Array(I::Item::TYPE).to_byte());
326 let array_start_index = self.data.len();
327 let mut n_items: u32 = 0;
328 n_items.write_to(self.data);
329 while let Some(x) = it.next() {
330 x.write_to(self.data);
331 n_items += 1;
332 }
333 for (i, b) in n_items.to_be_bytes().iter().enumerate() {
334 self.data[array_start_index + i] = *b;
335 }
336 }
337}
338
339impl<'a> ChiveIn<'a> {
341 pub fn u8(&mut self, x: u8) {
343 self.write_primitive::<u8>(x);
344 }
345
346 pub fn i8(&mut self, x: i8) {
348 self.write_primitive::<i8>(x);
349 }
350
351 pub fn u16(&mut self, x: u16) {
353 self.write_primitive::<u16>(x);
354 }
355
356 pub fn i16(&mut self, x: i16) {
358 self.write_primitive::<i16>(x);
359 }
360
361 pub fn u32(&mut self, x: u32) {
363 self.write_primitive::<u32>(x);
364 }
365
366 pub fn i32(&mut self, x: i32) {
368 self.write_primitive::<i32>(x);
369 }
370
371 pub fn u64(&mut self, x: u64) {
373 self.write_primitive::<u64>(x);
374 }
375
376 pub fn i64(&mut self, x: i64) {
378 self.write_primitive::<i64>(x);
379 }
380
381 pub fn f32(&mut self, x: f32) {
383 self.write_primitive::<f32>(x);
384 }
385
386 pub fn f64(&mut self, x: f64) {
388 self.write_primitive::<f64>(x);
389 }
390
391 pub fn array_slice_u8(&mut self, x: &[u8]) {
393 self.write_primitive_array_slice::<u8>(x);
394 }
395
396 pub fn array_slice_i8(&mut self, x: &[i8]) {
398 self.write_primitive_array_slice::<i8>(x);
399 }
400
401 pub fn array_slice_u16(&mut self, x: &[u16]) {
403 self.write_primitive_array_slice::<u16>(x);
404 }
405
406 pub fn array_slice_i16(&mut self, x: &[i16]) {
408 self.write_primitive_array_slice::<i16>(x);
409 }
410
411 pub fn array_slice_u32(&mut self, x: &[u32]) {
413 self.write_primitive_array_slice::<u32>(x);
414 }
415
416 pub fn array_slice_i32(&mut self, x: &[i32]) {
418 self.write_primitive_array_slice::<i32>(x);
419 }
420
421 pub fn array_slice_u64(&mut self, x: &[u64]) {
423 self.write_primitive_array_slice::<u64>(x);
424 }
425
426 pub fn array_slice_i64(&mut self, x: &[i64]) {
428 self.write_primitive_array_slice::<i64>(x);
429 }
430
431 pub fn array_slice_f32(&mut self, x: &[f32]) {
433 self.write_primitive_array_slice::<f32>(x);
434 }
435
436 pub fn array_slice_f64(&mut self, x: &[f64]) {
438 self.write_primitive_array_slice::<f64>(x);
439 }
440
441 pub fn array_iter_u8<I: Iterator<Item = u8>>(&mut self, it: I) {
443 self.write_primitive_array_iter(it);
444 }
445
446 pub fn array_iter_i8<I: Iterator<Item = i8>>(&mut self, it: I) {
448 self.write_primitive_array_iter(it);
449 }
450
451 pub fn array_iter_u16<I: Iterator<Item = u16>>(&mut self, it: I) {
453 self.write_primitive_array_iter(it);
454 }
455
456 pub fn array_iter_i16<I: Iterator<Item = i16>>(&mut self, it: I) {
458 self.write_primitive_array_iter(it);
459 }
460
461 pub fn array_iter_u32<I: Iterator<Item = u32>>(&mut self, it: I) {
463 self.write_primitive_array_iter(it);
464 }
465
466 pub fn array_iter_i32<I: Iterator<Item = i32>>(&mut self, it: I) {
468 self.write_primitive_array_iter(it);
469 }
470
471 pub fn array_iter_u64<I: Iterator<Item = u64>>(&mut self, it: I) {
473 self.write_primitive_array_iter(it);
474 }
475
476 pub fn array_iter_i64<I: Iterator<Item = i64>>(&mut self, it: I) {
478 self.write_primitive_array_iter(it);
479 }
480
481 pub fn array_iter_f32<I: Iterator<Item = f32>>(&mut self, it: I) {
483 self.write_primitive_array_iter(it);
484 }
485
486 pub fn array_iter_f64<I: Iterator<Item = f64>>(&mut self, it: I) {
488 self.write_primitive_array_iter(it);
489 }
490
491 pub fn string(&mut self, x: &str) {
493 let bytes = x.as_bytes();
494 self.data.reserve(u8::SIZE + u32::SIZE + bytes.len());
495 self.data.push(ValueType::String.to_byte());
496 let len = bytes.len() as u32;
497 len.write_to(self.data);
498 for b in bytes {
499 self.data.push(*b);
500 }
501 }
502
503 pub fn nest<F: FnOnce(ChiveIn)>(&mut self, f: F) {
509 self.data.push(ValueType::Nest.to_byte());
510
511 let prefix_index = self.data.len();
512
513 self.data.push(0);
514 self.data.push(0);
515 self.data.push(0);
516 self.data.push(0);
517
518 let len_before = self.data.len();
519
520 f(ChiveIn::new(self.data));
521
522 let len_after = self.data.len();
523 debug_assert!(len_after >= len_before);
524 let len = (len_after - len_before) as u32;
525 let [b0, b1, b2, b3] = len.to_be_bytes();
526
527 self.data[prefix_index + 0] = b0;
528 self.data[prefix_index + 1] = b1;
529 self.data[prefix_index + 2] = b2;
530 self.data[prefix_index + 3] = b3;
531 }
532
533 pub fn chivable<T: Chivable>(&mut self, chivable: &T) {
535 chivable.chive_in(self);
536 }
537}
538
539pub struct ChiveOutIterator<'a, T> {
542 chive_out: ChiveOut<'a>,
544
545 _phantom_data: PhantomData<T>,
547}
548
549impl<'a, T> ChiveOutIterator<'a, T> {
550 fn new(chive_out: ChiveOut<'a>) -> ChiveOutIterator<'a, T>
553 where
554 T: PrimitiveReadWrite,
555 {
556 debug_assert_eq!(chive_out.remaining_len() % T::SIZE, 0);
557 ChiveOutIterator {
558 chive_out,
559 _phantom_data: PhantomData,
560 }
561 }
562}
563
564impl<'a, T: PrimitiveReadWrite> Iterator for ChiveOutIterator<'a, T> {
566 type Item = T;
567
568 fn next(&mut self) -> Option<T> {
569 if self.chive_out.is_empty() {
570 return None;
571 }
572 debug_assert!(self.chive_out.remaining_len() >= T::SIZE);
573 Some(T::read_from(&mut self.chive_out))
574 }
575}
576
577impl<'a, T: PrimitiveReadWrite> ExactSizeIterator for ChiveOutIterator<'a, T> {
579 fn len(&self) -> usize {
580 debug_assert_eq!(self.chive_out.remaining_len() % T::SIZE, 0);
581 self.chive_out.remaining_len() / T::SIZE
582 }
583}
584
585pub struct ChiveOut<'a> {
587 data: &'a [u8],
588 position: usize,
589}
590
591impl<'a> ChiveOut<'a> {
593 fn new(data: &'a [u8]) -> ChiveOut<'a> {
595 ChiveOut { data, position: 0 }
596 }
597
598 fn remaining_len(&self) -> usize {
600 let l = self.data.len();
601 debug_assert!(self.position <= l);
602 return l - self.position;
603 }
604
605 fn read_byte(&mut self) -> Result<u8, ()> {
607 if self.position >= self.data.len() {
608 Err(())
609 } else {
610 let b = self.data[self.position];
611 self.position += 1;
612 Ok(b)
613 }
614 }
615
616 fn peek_byte(&self, offset: usize) -> Result<u8, ()> {
618 if (self.position + offset) >= self.data.len() {
619 Err(())
620 } else {
621 Ok(self.data[self.position + offset])
622 }
623 }
624
625 fn reset_on_error<T: 'a, F: FnOnce(&mut ChiveOut<'a>) -> Result<T, ()>>(
629 &mut self,
630 f: F,
631 ) -> Result<T, ()> {
632 let original_position = self.position;
633 let result = f(self);
634 if result.is_err() {
635 self.position = original_position;
636 }
637 result
638 }
639
640 fn read_primitive<T: PrimitiveReadWrite + 'static>(&mut self) -> Result<T, ()> {
643 self.reset_on_error(|d| {
644 if d.remaining_len() < (u8::SIZE + T::SIZE) {
645 return Err(());
646 }
647 let the_type = ValueType::from_byte(d.read_byte()?)?;
648 if the_type != ValueType::Primitive(T::TYPE) {
649 return Err(());
650 }
651 Ok(T::read_from(d))
652 })
653 }
654
655 fn read_primitive_array_slice<T: PrimitiveReadWrite + 'static>(
658 &mut self,
659 ) -> Result<Vec<T>, ()> {
660 self.reset_on_error(|d| {
661 if d.remaining_len() < (u8::SIZE + u32::SIZE) {
662 return Err(());
663 }
664 let the_type = ValueType::from_byte(d.read_byte()?)?;
665 if the_type != ValueType::Array(T::TYPE) {
666 return Err(());
667 }
668 let len = u32::read_from(d) as usize;
669 if d.remaining_len() < (len * T::SIZE) {
670 return Err(());
671 }
672 Ok((0..len).map(|_| T::read_from(d)).collect())
673 })
674 }
675
676 fn read_primitive_array_iter<'b, T: PrimitiveReadWrite + 'static>(
679 &'b mut self,
680 ) -> Result<ChiveOutIterator<'b, T>, ()> {
681 self.reset_on_error(|d| {
682 if d.remaining_len() < (u8::SIZE + u32::SIZE) {
683 return Err(());
684 }
685 let the_type = ValueType::from_byte(d.read_byte()?)?;
686 if the_type != ValueType::Array(T::TYPE) {
687 return Err(());
688 }
689 let len = u32::read_from(d) as usize;
690 let byte_len = len * T::SIZE;
691 if d.remaining_len() < byte_len {
692 return Err(());
693 }
694 let d2 = ChiveOut::new(&d.data[d.position..d.position + byte_len]);
695 d.position += byte_len;
696 Ok(ChiveOutIterator::new(d2))
697 })
698 }
699}
700
701impl<'a> ChiveOut<'a> {
703 pub fn u8(&mut self) -> Result<u8, ()> {
705 self.read_primitive::<u8>()
706 }
707
708 pub fn i8(&mut self) -> Result<i8, ()> {
710 self.read_primitive::<i8>()
711 }
712
713 pub fn u16(&mut self) -> Result<u16, ()> {
715 self.read_primitive::<u16>()
716 }
717
718 pub fn i16(&mut self) -> Result<i16, ()> {
720 self.read_primitive::<i16>()
721 }
722
723 pub fn u32(&mut self) -> Result<u32, ()> {
725 self.read_primitive::<u32>()
726 }
727
728 pub fn i32(&mut self) -> Result<i32, ()> {
730 self.read_primitive::<i32>()
731 }
732
733 pub fn u64(&mut self) -> Result<u64, ()> {
735 self.read_primitive::<u64>()
736 }
737
738 pub fn i64(&mut self) -> Result<i64, ()> {
740 self.read_primitive::<i64>()
741 }
742
743 pub fn f32(&mut self) -> Result<f32, ()> {
745 self.read_primitive::<f32>()
746 }
747
748 pub fn f64(&mut self) -> Result<f64, ()> {
750 self.read_primitive::<f64>()
751 }
752
753 pub fn array_slice_u8(&mut self) -> Result<Vec<u8>, ()> {
755 self.read_primitive_array_slice::<u8>()
756 }
757
758 pub fn array_slice_i8(&mut self) -> Result<Vec<i8>, ()> {
760 self.read_primitive_array_slice::<i8>()
761 }
762
763 pub fn array_slice_u16(&mut self) -> Result<Vec<u16>, ()> {
765 self.read_primitive_array_slice::<u16>()
766 }
767
768 pub fn array_slice_i16(&mut self) -> Result<Vec<i16>, ()> {
770 self.read_primitive_array_slice::<i16>()
771 }
772
773 pub fn array_slice_u32(&mut self) -> Result<Vec<u32>, ()> {
775 self.read_primitive_array_slice::<u32>()
776 }
777
778 pub fn array_slice_i32(&mut self) -> Result<Vec<i32>, ()> {
780 self.read_primitive_array_slice::<i32>()
781 }
782
783 pub fn array_slice_u64(&mut self) -> Result<Vec<u64>, ()> {
785 self.read_primitive_array_slice::<u64>()
786 }
787
788 pub fn array_slice_i64(&mut self) -> Result<Vec<i64>, ()> {
790 self.read_primitive_array_slice::<i64>()
791 }
792
793 pub fn array_slice_f32(&mut self) -> Result<Vec<f32>, ()> {
795 self.read_primitive_array_slice::<f32>()
796 }
797
798 pub fn array_slice_f64(&mut self) -> Result<Vec<f64>, ()> {
800 self.read_primitive_array_slice::<f64>()
801 }
802
803 pub fn array_iter_u8<'b>(&'b mut self) -> Result<ChiveOutIterator<'b, u8>, ()> {
805 self.read_primitive_array_iter::<u8>()
806 }
807
808 pub fn array_iter_i8<'b>(&'b mut self) -> Result<ChiveOutIterator<'b, i8>, ()> {
810 self.read_primitive_array_iter::<i8>()
811 }
812
813 pub fn array_iter_u16<'b>(&'b mut self) -> Result<ChiveOutIterator<'b, u16>, ()> {
815 self.read_primitive_array_iter::<u16>()
816 }
817
818 pub fn array_iter_i16<'b>(&'b mut self) -> Result<ChiveOutIterator<'b, i16>, ()> {
820 self.read_primitive_array_iter::<i16>()
821 }
822
823 pub fn array_iter_u32<'b>(&'b mut self) -> Result<ChiveOutIterator<'b, u32>, ()> {
825 self.read_primitive_array_iter::<u32>()
826 }
827
828 pub fn array_iter_i32<'b>(&'b mut self) -> Result<ChiveOutIterator<'b, i32>, ()> {
830 self.read_primitive_array_iter::<i32>()
831 }
832
833 pub fn array_iter_u64<'b>(&'b mut self) -> Result<ChiveOutIterator<'b, u64>, ()> {
835 self.read_primitive_array_iter::<u64>()
836 }
837
838 pub fn array_iter_i64<'b>(&'b mut self) -> Result<ChiveOutIterator<'b, i64>, ()> {
840 self.read_primitive_array_iter::<i64>()
841 }
842
843 pub fn array_iter_f32<'b>(&'b mut self) -> Result<ChiveOutIterator<'b, f32>, ()> {
845 self.read_primitive_array_iter::<f32>()
846 }
847
848 pub fn array_iter_f64<'b>(&'b mut self) -> Result<ChiveOutIterator<'b, f64>, ()> {
850 self.read_primitive_array_iter::<f64>()
851 }
852
853 pub fn string(&mut self) -> Result<String, ()> {
855 if self.remaining_len() < (u8::SIZE + u32::SIZE) {
856 return Err(());
857 }
858 let the_type = ValueType::from_byte(self.read_byte()?)?;
859 if the_type != ValueType::String {
860 return Err(());
861 }
862 let len = u32::read_from(self) as usize;
863 if self.remaining_len() < len {
864 return Err(());
865 }
866 let slice = &self.data[self.position..(self.position + len)];
867 self.position += len;
868 let str_slice = std::str::from_utf8(slice).map_err(|_| ())?;
869 Ok(str_slice.to_string())
870 }
871
872 pub fn nest<'b>(&'b mut self) -> Result<ChiveOut<'b>, ()> {
874 if self.remaining_len() < (u8::SIZE + u32::SIZE) {
875 return Err(());
876 }
877 let the_type = ValueType::from_byte(self.read_byte()?)?;
878 if the_type != ValueType::Nest {
879 return Err(());
880 }
881 let len = u32::read_from(self) as usize;
882 if self.remaining_len() < len {
883 return Err(());
884 }
885 let nest_slice: &[u8] = &self.data[self.position..(self.position + len)];
886 self.position += len;
887 Ok(ChiveOut::new(nest_slice))
888 }
889
890 pub fn chivable<T: Chivable>(&mut self) -> Result<T, ()> {
894 T::chive_out(self)
895 }
896
897 pub fn peek_type(&self) -> Result<ValueType, ()> {
899 ValueType::from_byte(self.peek_byte(0)?)
900 }
901
902 pub fn peek_length_bytes(&self) -> Result<usize, ()> {
905 let the_type = ValueType::from_byte(self.peek_byte(0)?)?;
906 if let ValueType::Primitive(_) = the_type {
907 return Err(());
908 }
909 Ok(u32::from_be_bytes([
910 self.peek_byte(1)?,
911 self.peek_byte(2)?,
912 self.peek_byte(3)?,
913 self.peek_byte(4)?,
914 ]) as usize)
915 }
916
917 pub fn is_empty(&self) -> bool {
919 return self.position == self.data.len();
920 }
921}