-
-
Notifications
You must be signed in to change notification settings - Fork 76
Open
Description
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)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels