use crate::prelude::*;
pub const MAX_PACKET_DATA_LEN: usize = 1024;
pub const PACKET_HEADER_LEN: usize = 4 + PacketAck::BYTE_LEN + 2 + 4;
pub const MAX_PACKET_LEN: usize = PACKET_HEADER_LEN + MAX_PACKET_DATA_LEN;
#[derive(ByteRepr, Debug)]
#[cfg_attr(test, derive(PartialEq))]
pub(super) struct Packet<M: ByteRepr> {
pub(super) ack: PacketAck,
pub(super) reliable: bool,
pub(super) ordered: bool,
pub(super) messages: Vec<M>,
}
impl<M: ByteRepr> Packet<M> {
#[inline(always)]
pub(super) fn heartbeat(ack: PacketAck) -> Self {
Self {
ack,
reliable: false,
ordered: false,
messages: vec![],
}
}
}
#[cfg(test)]
pub mod test {
use crate::{packet::Packet, prelude::*, ring_buffer::RingBuffer};
#[derive(ByteRepr, Debug, PartialEq, Hash, Eq, Clone, Copy)]
pub enum InnerUdpMessage {
Hello,
Wave(u16),
}
#[test]
fn packet_byte_repr() {
let packet = Packet {
ack: PacketAck::new::<bool>(0, &RingBuffer::new(), &RingBuffer::new()),
reliable: true,
ordered: false,
messages: vec![
InnerUdpMessage::Wave(12),
InnerUdpMessage::Wave(9284),
InnerUdpMessage::Hello,
],
};
assert_eq!(PacketAck::MIN_BYTE_LEN, 14);
assert_eq!(Packet::<InnerUdpMessage>::MIN_BYTE_LEN, 20);
assert_eq!(Packet::<InnerUdpMessage>::MAX_BYTE_LEN, 3020);
let mut buf = [0; Packet::<InnerUdpMessage>::MAX_BYTE_LEN];
assert!(packet.write_to_bytes(&mut buf).is_ok());
assert_eq!(
Packet::<InnerUdpMessage>::from_bytes(&buf[..packet.byte_len()]).unwrap(),
packet
);
}
}