Skip to main content

MessageAssembler

Trait MessageAssembler 

Source
pub trait MessageAssembler:
    Send
    + Sync
    + 'static {
    // Required method
    fn parse_frame_header(
        &self,
        payload: &[u8],
    ) -> Result<ParsedFrameHeader, Error>;
}
Expand description

Hook trait for protocol-specific multi-frame request parsing.

Implementations should parse only the per-frame header and return the parsed header plus the number of bytes consumed. The remaining bytes are treated as the frame’s body chunk.

§Examples

use bytes::Buf;
use wireframe::message_assembler::{
    FirstFrameHeader,
    FrameHeader,
    MessageAssembler,
    MessageKey,
    ParsedFrameHeader,
};

struct DemoAssembler;

impl MessageAssembler for DemoAssembler {
    fn parse_frame_header(&self, payload: &[u8]) -> Result<ParsedFrameHeader, std::io::Error> {
        let mut buf = payload;
        if buf.remaining() < 9 {
            return Err(std::io::Error::new(
                std::io::ErrorKind::InvalidData,
                "header too short",
            ));
        }

        let tag = buf.get_u8();
        let key = MessageKey::from(buf.get_u64());
        let header = match tag {
            0x01 => FrameHeader::First(FirstFrameHeader {
                message_key: key,
                metadata_len: 0,
                body_len: buf.remaining(),
                total_body_len: None,
                is_last: true,
            }),
            _ => {
                return Err(std::io::Error::new(
                    std::io::ErrorKind::InvalidData,
                    "unknown header tag",
                ));
            }
        };

        let header_len = payload.len() - buf.remaining();
        Ok(ParsedFrameHeader::new(header, header_len))
    }
}

Required Methods§

Source

fn parse_frame_header(&self, payload: &[u8]) -> Result<ParsedFrameHeader, Error>

Parse a protocol header from the provided payload bytes.

§Errors

Returns an io::Error when the header is malformed or incomplete.

§Examples
use wireframe::message_assembler::{MessageAssembler, ParsedFrameHeader};

struct Demo;

impl MessageAssembler for Demo {
    fn parse_frame_header(&self, _payload: &[u8]) -> Result<ParsedFrameHeader, std::io::Error> {
        Err(std::io::Error::new(
            std::io::ErrorKind::InvalidData,
            "header not implemented",
        ))
    }
}

Implementors§