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}