use bytes::Bytes;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[repr(C)]
pub enum PacketHeader {
Ordered { stream_id: Option<u8> },
ReliableSequenced { stream_id: Option<u8>, seq_id: u16 },
ReliableUnordered,
UnreliableSequenced { stream_id: Option<u8>, seq_id: u16 },
Unreliable,
}
impl Default for PacketHeader {
fn default() -> Self {
Self::Ordered { stream_id: None }
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Packet {
pub header: PacketHeader,
pub bytes: Bytes,
}
impl Packet {
pub fn ordered(bytes: Bytes, stream: Option<u8>) -> Self {
Self {
bytes,
header: PacketHeader::Ordered { stream_id: stream },
}
}
pub fn ordered_from(bytes: &[u8], stream: Option<u8>) -> Self {
Self {
bytes: Bytes::copy_from_slice(bytes),
header: PacketHeader::Ordered { stream_id: stream },
}
}
pub fn reliable_sequenced(bytes: Bytes, stream: Option<u8>) -> Self {
Self {
bytes,
header: PacketHeader::ReliableSequenced {
stream_id: stream,
seq_id: 0,
},
}
}
pub fn reliable_sequenced_from(bytes: &[u8], stream: Option<u8>) -> Self {
Self {
bytes: Bytes::copy_from_slice(bytes),
header: PacketHeader::ReliableSequenced {
stream_id: stream,
seq_id: 0,
},
}
}
pub fn reliable_unordered(bytes: Bytes) -> Self {
Self {
bytes,
header: PacketHeader::ReliableUnordered,
}
}
pub fn reliable_unordered_from(bytes: &[u8]) -> Self {
Self {
bytes: Bytes::copy_from_slice(bytes),
header: PacketHeader::ReliableUnordered,
}
}
pub fn unreliable_sequenced(bytes: Bytes, stream: Option<u8>) -> Self {
Self {
bytes,
header: PacketHeader::UnreliableSequenced {
stream_id: stream,
seq_id: 0,
},
}
}
pub fn unreliable_sequenced_from(bytes: &[u8], stream: Option<u8>) -> Self {
Self {
bytes: Bytes::copy_from_slice(bytes),
header: PacketHeader::UnreliableSequenced {
stream_id: stream,
seq_id: 0,
},
}
}
pub fn unreliable(bytes: Bytes) -> Self {
Self {
bytes,
header: PacketHeader::Unreliable,
}
}
pub fn unreliable_from(bytes: &[u8]) -> Self {
Self {
bytes: Bytes::copy_from_slice(bytes),
header: PacketHeader::Unreliable,
}
}
}