nerve-ipc 0.2.0

Binary framing protocol for local IPC over Unix Domain Sockets
Documentation
//! Wire-level frame definitions.
//!
//! `FrameHeader` is fixed-size (20 bytes, little-endian) and
//! `Frame` provides a borrowed view over decoded payload data.

// wire level frame header (fixed size : 20 bytes)
//
// Layout (little-endian):
//   magic          : u32
//   version        : u16
//   message_type   : u8
//   flags          : u8
//   request_id     : u64
//   payload_length : u32
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct FrameHeader {
    pub magic: u32,
    pub version: u16,
    pub msg_type: u8,
    pub flags: u8,
    pub request_id: u64,
    pub payload_length: u32,
}

impl FrameHeader {
    // size of the frame header in bytes (wire invariant)
    pub const SIZE: usize = 20;
}

/// A decoded frame view — does not own the payload;
/// ownership and buffering are handled by the transport layer.
#[derive(Debug)]
pub struct Frame<'a> {
    pub header: FrameHeader,
    pub payload: &'a [u8],
}

/// An owned, decoded frame — holds its payload in a `Vec<u8>`.
///
/// Produced by [`FrameReader`](crate::io::FrameReader) after a complete frame
/// has been assembled from the byte stream.
#[derive(Debug)]
pub struct OwnedFrame {
    pub header: FrameHeader,
    pub payload: Vec<u8>,
}

impl OwnedFrame {
    /// Returns a borrowed view of this frame.
    #[must_use]
    #[inline]
    pub fn as_borrowed(&self) -> Frame<'_> {
        Frame {
            header: self.header,
            payload: &self.payload,
        }
    }
}