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§
Sourcefn parse_frame_header(&self, payload: &[u8]) -> Result<ParsedFrameHeader, Error>
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",
))
}
}