Skip to content

Get payload size in a simpler way #599

@redeexpressos

Description

@redeexpressos

hi. im trying to get the payload size using deku so I can write to a connection (asyncwrite). I dont have the to_bytes function in my message type so then I could use len(). (see FIXME)
Am I doing something wrong? I created the create_packet function to workaround but seems weird...

#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
pub struct KeepAlive {}

#[derive(Debug, Clone, Copy, PartialEq, DekuRead, DekuWrite)]
#[deku(endian = "endianness", ctx = "endianness: deku::ctx::Endian")]
pub struct MessageHeader {
    pub message_id: u32,
    pub len: u32,
}

#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
#[deku(endian = "big")]
pub struct MessagePacket {
    pub header: MessageHeader,

    #[deku(ctx = "*header")]
    pub payload: Payload,
}

#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
#[deku(ctx = "_: deku::ctx::Endian, header: MessageHeader")]
pub struct Payload {
    #[deku(
        bytes_read = "header.len",
        assert = "header.len <= 8192",
        ctx = "header.message_id"
    )]
    pub message_with_limit: MessageWithLimit,
}

#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
#[deku(id = "message_id", ctx = "message_id: u32")]
pub enum Message {
    #[deku(id = 0x0000_00FF)]
    KeepAlive(messages::KeepAlive),

   // ...
}


fn create_keep_alive_message() -> MessagePacket {
    let message = Message::KeepAlive(KeepAlive {});
    create_packet(message)
}

#[must_use]
fn create_packet(message: Message) -> MessagePacket {
    let message_id = message.deku_id().unwrap();

    // FIXME: weird solution to get payload size of Message to set remaining_bytes...??
    let mut buf = vec![];
    let mut cursor = Cursor::new(&mut buf);
    let mut writer = Writer::new(&mut cursor);
    message.to_writer(&mut writer, message_id).unwrap();
    let remaining_bytes = cursor.get_ref().len() as u32;

    let header = MessageHeader {  message_id, remaining_bytes };
    let message_with_limit = MessageWithLimit { message };
    let payload = ControlPayload { message_with_limit };

    MessagePacket { header, payload }
}

TLDR: how to get payload length of a Message (which is an enum)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions