Skip to main content

streaming_crypto/core_api/stream_v2/segmenting/
decode.rs

1use crate::stream_v2::segmenting::{SegmentHeader, types::{SegmentError, SegmentView}};
2
3// ✅ **This is segmenting-only**
4// ✅ **No duplicate decode logic**
5// ✅ **Zero-copy slicing works perfectly**
6#[inline]
7pub fn decode_segment_header(wire: &[u8]) -> Result<SegmentHeader, SegmentError> {
8    SegmentHeader::from_bytes(wire)
9}
10
11/// Decode a single segment from bytes.
12///
13/// Caller guarantees:
14/// - Full segment bytes are provided
15/// - Ordering is handled externally
16pub fn decode_segment(wire: &[u8]) -> Result<SegmentView<'_>, SegmentError> {
17    let header = SegmentHeader::from_bytes(wire)?;
18
19    let expected_len = SegmentHeader::LEN + header.wire_len() as usize;
20    if wire.len() != expected_len {
21        return Err(SegmentError::LengthMismatch {
22            expected: expected_len,
23            actual: wire.len(),
24        });
25    }
26
27    let segment_wire = &wire[SegmentHeader::LEN..expected_len];
28
29    Ok(SegmentView {
30        header,
31        wire: segment_wire,
32    })
33
34    // 🚫 no `Vec`
35    // 🚫 no allocation
36    // 🚫 no copy
37    // ✔ constant time
38    // ✔ cache-friendly
39}