Skip to main content

ps_ecc/long/header/methods/
from_byte_slice.rs

1use crate::long::LongEccHeader;
2use crate::LongEccHeaderFromByteSliceError;
3
4impl LongEccHeader {
5    /// Parses a header from the first 32 bytes of a slice.
6    ///
7    /// # Errors
8    /// Returns `InsufficientBytes` if `bytes` holds fewer than 32 bytes, or a
9    /// [`LongEccHeaderFromBytesError`](crate::LongEccHeaderFromBytesError)
10    /// if parsing the header fails.
11    pub fn from_byte_slice(bytes: &[u8]) -> Result<Self, LongEccHeaderFromByteSliceError> {
12        let len = bytes.len();
13
14        let header_bytes = bytes
15            .first_chunk::<32>()
16            .ok_or(LongEccHeaderFromByteSliceError::InsufficientBytes(len))?;
17
18        Ok(Self::from_bytes(*header_bytes)?)
19    }
20}
21
22#[cfg(test)]
23mod tests {
24    use crate::long::{LongEccHeader, OverlapFactor};
25
26    use super::LongEccHeaderFromByteSliceError;
27
28    type TestError = Box<dyn std::error::Error>;
29
30    #[test]
31    fn test_from_byte_slice_roundtrip() -> Result<(), TestError> {
32        let header = LongEccHeader::new(2, OverlapFactor::Simple, 86, 50, 7)?;
33
34        let parsed = LongEccHeader::from_byte_slice(&header.to_bytes())?;
35
36        assert_eq!(parsed, header);
37
38        Ok(())
39    }
40
41    #[test]
42    fn test_from_byte_slice_ignores_trailing_bytes() -> Result<(), TestError> {
43        let header = LongEccHeader::new(2, OverlapFactor::Double, 86, 50, 7)?;
44
45        let mut bytes = header.to_bytes().to_vec();
46
47        bytes.extend_from_slice(&[0xAB; 16]);
48
49        let parsed = LongEccHeader::from_byte_slice(&bytes)?;
50
51        assert_eq!(parsed, header);
52
53        Ok(())
54    }
55
56    #[test]
57    fn test_from_byte_slice_insufficient_bytes() {
58        let result = LongEccHeader::from_byte_slice(&[0u8; 31]);
59
60        assert_eq!(
61            result,
62            Err(LongEccHeaderFromByteSliceError::InsufficientBytes(31))
63        );
64    }
65
66    #[test]
67    fn test_from_byte_slice_empty_slice() {
68        let result = LongEccHeader::from_byte_slice(&[]);
69
70        assert_eq!(
71            result,
72            Err(LongEccHeaderFromByteSliceError::InsufficientBytes(0))
73        );
74    }
75}