ps_ecc/long/header/methods/
from_byte_slice.rs1use crate::long::LongEccHeader;
2use crate::LongEccHeaderFromByteSliceError;
3
4impl LongEccHeader {
5 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}