fn from_bytes()

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,
        })
    }