lilliput_core/header/
bytes.rs1#[cfg(any(test, feature = "testing"))]
2use proptest::prelude::*;
3#[cfg(any(test, feature = "testing"))]
4use proptest_derive::Arbitrary;
5
6#[cfg_attr(any(test, feature = "testing"), derive(Arbitrary))]
8#[derive(Copy, Clone, Eq, PartialEq, Debug)]
9pub struct BytesHeader {
10 #[cfg_attr(
11 any(test, feature = "testing"),
12 proptest(strategy = "super::arbitrary_len()")
13 )]
14 len: usize,
15}
16
17impl BytesHeader {
18 #[inline]
20 pub fn for_len(len: usize) -> Self {
21 Self { len }
22 }
23
24 #[inline]
26 pub fn is_empty(&self) -> bool {
27 self.len() == 0
28 }
29
30 #[inline]
32 pub fn len(&self) -> usize {
33 self.len
34 }
35}
36
37impl BytesHeader {
38 pub(crate) const MASK: u8 = 0b00000111;
39 pub(crate) const TYPE_BITS: u8 = 0b00000100;
40
41 pub(crate) const LEN_WIDTH_EXPONENT_BITS: u8 = 0b00000011;
42}
43
44#[cfg(test)]
45mod tests {
46 use proptest::prelude::*;
47 use test_log::test;
48
49 use crate::{
50 config::EncoderConfig,
51 decoder::Decoder,
52 encoder::Encoder,
53 io::{SliceReader, VecWriter},
54 };
55
56 use super::*;
57
58 proptest! {
59 #[test]
60 fn encode_decode_roundtrip(header in BytesHeader::arbitrary(), config in EncoderConfig::arbitrary()) {
61 let mut encoded: Vec<u8> = Vec::new();
62 let writer = VecWriter::new(&mut encoded);
63 let mut encoder = Encoder::new(writer, config);
64 encoder.encode_bytes_header(&header).unwrap();
65
66 prop_assert!(encoded.len() <= 1 + 8);
67
68 let reader = SliceReader::new(&encoded);
69 let mut decoder = Decoder::from_reader(reader);
70 let decoded = decoder.decode_bytes_header().unwrap();
71 prop_assert_eq!(&decoded, &header);
72 }
73 }
74}