lilliput_core/header/
bytes.rs

1#[cfg(any(test, feature = "testing"))]
2use proptest::prelude::*;
3#[cfg(any(test, feature = "testing"))]
4use proptest_derive::Arbitrary;
5
6/// Header representing a byte sequence.
7#[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    /// Creates a header from a byte array's length.
19    #[inline]
20    pub fn for_len(len: usize) -> Self {
21        Self { len }
22    }
23
24    /// Returns `true` if the associated value has a length of zero bytes, otherwise `false`.
25    #[inline]
26    pub fn is_empty(&self) -> bool {
27        self.len() == 0
28    }
29
30    /// Returns the associated value's length.
31    #[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}