use std::net::SocketAddr;
use crate::packet::{DeliveryGuarantee, OrderingGuarantee, PacketType};
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct Packet {
addr: SocketAddr,
payload: Box<[u8]>,
delivery: DeliveryGuarantee,
ordering: OrderingGuarantee,
}
impl Packet {
pub(crate) fn new(
addr: SocketAddr,
payload: Box<[u8]>,
delivery: DeliveryGuarantee,
ordering: OrderingGuarantee,
) -> Packet {
Packet {
addr,
payload,
delivery,
ordering,
}
}
pub fn unreliable(addr: SocketAddr, payload: Vec<u8>) -> Packet {
Packet {
addr,
payload: payload.into_boxed_slice(),
delivery: DeliveryGuarantee::Unreliable,
ordering: OrderingGuarantee::None,
}
}
pub fn unreliable_sequenced(
addr: SocketAddr,
payload: Vec<u8>,
stream_id: Option<u8>,
) -> Packet {
Packet {
addr,
payload: payload.into_boxed_slice(),
delivery: DeliveryGuarantee::Unreliable,
ordering: OrderingGuarantee::Sequenced(stream_id),
}
}
pub fn reliable_unordered(addr: SocketAddr, payload: Vec<u8>) -> Packet {
Packet {
addr,
payload: payload.into_boxed_slice(),
delivery: DeliveryGuarantee::Reliable,
ordering: OrderingGuarantee::None,
}
}
pub fn reliable_ordered(addr: SocketAddr, payload: Vec<u8>, stream_id: Option<u8>) -> Packet {
Packet {
addr,
payload: payload.into_boxed_slice(),
delivery: DeliveryGuarantee::Reliable,
ordering: OrderingGuarantee::Ordered(stream_id),
}
}
pub fn reliable_sequenced(addr: SocketAddr, payload: Vec<u8>, stream_id: Option<u8>) -> Packet {
Packet {
addr,
payload: payload.into_boxed_slice(),
delivery: DeliveryGuarantee::Reliable,
ordering: OrderingGuarantee::Sequenced(stream_id),
}
}
pub fn payload(&self) -> &[u8] {
&self.payload
}
pub fn addr(&self) -> SocketAddr {
self.addr
}
pub fn delivery_guarantee(&self) -> DeliveryGuarantee {
self.delivery
}
pub fn order_guarantee(&self) -> OrderingGuarantee {
self.ordering
}
}
#[derive(Debug)]
pub struct PacketInfo<'a> {
pub(crate) packet_type: PacketType,
pub(crate) payload: &'a [u8],
pub(crate) delivery: DeliveryGuarantee,
pub(crate) ordering: OrderingGuarantee,
}
impl<'a> PacketInfo<'a> {
pub fn user_packet(
payload: &'a [u8],
delivery: DeliveryGuarantee,
ordering: OrderingGuarantee,
) -> Self {
PacketInfo {
packet_type: PacketType::Packet,
payload,
delivery,
ordering,
}
}
pub fn heartbeat_packet(payload: &'a [u8]) -> Self {
PacketInfo {
packet_type: PacketType::Heartbeat,
payload,
delivery: DeliveryGuarantee::Unreliable,
ordering: OrderingGuarantee::None,
}
}
}
#[cfg(test)]
mod tests {
use std::net::SocketAddr;
use crate::packet::{DeliveryGuarantee, OrderingGuarantee, Packet};
#[test]
fn assure_creation_unreliable_packet() {
let packet = Packet::unreliable(test_addr(), test_payload());
assert_eq!(packet.addr(), test_addr());
assert_eq!(packet.payload(), test_payload().as_slice());
assert_eq!(packet.delivery_guarantee(), DeliveryGuarantee::Unreliable);
assert_eq!(packet.order_guarantee(), OrderingGuarantee::None);
}
#[test]
fn assure_creation_unreliable_sequenced() {
let packet = Packet::unreliable_sequenced(test_addr(), test_payload(), Some(1));
assert_eq!(packet.addr(), test_addr());
assert_eq!(packet.payload(), test_payload().as_slice());
assert_eq!(packet.delivery_guarantee(), DeliveryGuarantee::Unreliable);
assert_eq!(
packet.order_guarantee(),
OrderingGuarantee::Sequenced(Some(1))
);
}
#[test]
fn assure_creation_reliable() {
let packet = Packet::reliable_unordered(test_addr(), test_payload());
assert_eq!(packet.addr(), test_addr());
assert_eq!(packet.payload(), test_payload().as_slice());
assert_eq!(packet.delivery_guarantee(), DeliveryGuarantee::Reliable);
assert_eq!(packet.order_guarantee(), OrderingGuarantee::None);
}
#[test]
fn assure_creation_reliable_ordered() {
let packet = Packet::reliable_ordered(test_addr(), test_payload(), Some(1));
assert_eq!(packet.addr(), test_addr());
assert_eq!(packet.payload(), test_payload().as_slice());
assert_eq!(packet.delivery_guarantee(), DeliveryGuarantee::Reliable);
assert_eq!(
packet.order_guarantee(),
OrderingGuarantee::Ordered(Some(1))
);
}
#[test]
fn assure_creation_reliable_sequence() {
let packet = Packet::reliable_sequenced(test_addr(), test_payload(), Some(1));
assert_eq!(packet.addr(), test_addr());
assert_eq!(packet.payload(), test_payload().as_slice());
assert_eq!(packet.delivery_guarantee(), DeliveryGuarantee::Reliable);
assert_eq!(
packet.order_guarantee(),
OrderingGuarantee::Sequenced(Some(1))
);
}
fn test_payload() -> Vec<u8> {
b"test".to_vec()
}
fn test_addr() -> SocketAddr {
"127.0.0.1:12345".parse().unwrap()
}
}