in core/sdk/src/models/messaging/message.rs [430:478]
fn from_bytes(bytes: Bytes) -> Result<Self, IggyError> {
if bytes.len() < IGGY_MESSAGE_HEADER_SIZE {
return Err(IggyError::InvalidCommand);
}
let mut position = 0;
let header = IggyMessageHeader::from_bytes(bytes.slice(0..IGGY_MESSAGE_HEADER_SIZE))?;
position += IGGY_MESSAGE_HEADER_SIZE;
let payload_end = position + header.payload_length as usize;
if payload_end > bytes.len() {
return Err(IggyError::InvalidMessagePayloadLength);
}
let payload = bytes.slice(position..payload_end);
position = payload_end;
let user_headers = if header.user_headers_length > 0 {
let headers_end = position + header.user_headers_length as usize;
if headers_end > bytes.len() {
return Err(IggyError::InvalidHeaderValue);
}
Some(bytes.slice(position..headers_end))
} else {
None
};
#[cfg(debug_assertions)]
{
assert_eq!(
user_headers.as_ref().map(|h| h.len()).unwrap_or(0),
header.user_headers_length as usize,
"user_headers.len() != header.user_headers_length"
);
assert_eq!(
payload.len(),
header.payload_length as usize,
"payload.len() != header.payload_length"
)
}
Ok(IggyMessage {
header,
payload,
user_headers,
})
}