streaming_crypto/core_api/stream_v2/segmenting/
encode.rs1use byteorder::{LittleEndian, WriteBytesExt};
2use bytes::Bytes;
3
4use crate::stream_v2::segmenting::{SegmentHeader, types::SegmentError};
5
6pub fn encode_segment(
21 header: &SegmentHeader,
22 segment_wire: &Bytes,
23) -> Result<Vec<u8>, SegmentError> {
24 let expected = SegmentHeader::LEN + header.wire_len() as usize;
25
26 if segment_wire.len() != header.wire_len() as usize {
27 return Err(SegmentError::LengthMismatch {
28 expected,
29 actual: segment_wire.len(),
30 });
31 }
32
33 let mut wire = Vec::with_capacity(expected);
34
35 wire.write_u32::<LittleEndian>(header.segment_index()).unwrap();
37 wire.write_u32::<LittleEndian>(header.bytes_len()).unwrap();
38 wire.write_u32::<LittleEndian>(header.wire_len()).unwrap();
39 wire.write_u32::<LittleEndian>(header.wire_crc32()).unwrap();
40 wire.write_u32::<LittleEndian>(header.frame_count()).unwrap();
41 wire.write_u16::<LittleEndian>(header.digest_alg()).unwrap();
42 wire.write_u16::<LittleEndian>(header.flags().bits()).unwrap();
43 wire.write_u32::<LittleEndian>(header.header_crc32()).unwrap();
44
45 wire.extend_from_slice(segment_wire);
47
48 debug_assert_eq!(wire.len(), expected);
50
51 Ok(wire)
52
53 }