Skip to main content

nerve_ipc/
frame.rs

1//! Wire-level frame definitions.
2//!
3//! `FrameHeader` is fixed-size (20 bytes, little-endian) and
4//! `Frame` provides a borrowed view over decoded payload data.
5
6// wire level frame header (fixed size : 20 bytes)
7//
8// Layout (little-endian):
9//   magic          : u32
10//   version        : u16
11//   message_type   : u8
12//   flags          : u8
13//   request_id     : u64
14//   payload_length : u32
15#[repr(C)]
16#[derive(Debug, Clone, Copy, PartialEq, Eq)]
17pub struct FrameHeader {
18    pub magic: u32,
19    pub version: u16,
20    pub msg_type: u8,
21    pub flags: u8,
22    pub request_id: u64,
23    pub payload_length: u32,
24}
25
26impl FrameHeader {
27    // size of the frame header in bytes (wire invariant)
28    pub const SIZE: usize = 20;
29}
30
31/// A decoded frame view — does not own the payload;
32/// ownership and buffering are handled by the transport layer.
33#[derive(Debug)]
34pub struct Frame<'a> {
35    pub header: FrameHeader,
36    pub payload: &'a [u8],
37}
38
39/// An owned, decoded frame — holds its payload in a `Vec<u8>`.
40///
41/// Produced by [`FrameReader`](crate::io::FrameReader) after a complete frame
42/// has been assembled from the byte stream.
43#[derive(Debug)]
44pub struct OwnedFrame {
45    pub header: FrameHeader,
46    pub payload: Vec<u8>,
47}
48
49impl OwnedFrame {
50    /// Returns a borrowed view of this frame.
51    #[must_use]
52    #[inline]
53    pub fn as_borrowed(&self) -> Frame<'_> {
54        Frame {
55            header: self.header,
56            payload: &self.payload,
57        }
58    }
59}