mod header;
pub use header::PacketHeader;
use bytes::Bytes;
use crate::constants::PacketType;
use crate::error::Result;
#[derive(Debug, Clone)]
pub struct Packet {
pub header: PacketHeader,
pub payload: Bytes,
}
impl Packet {
pub fn new(header: PacketHeader, payload: Bytes) -> Self {
Self { header, payload }
}
pub fn from_bytes(data: Bytes) -> Result<Self> {
let header = PacketHeader::parse(&data)?;
let payload = data.slice(crate::constants::PACKET_HEADER_SIZE..);
Ok(Self { header, payload })
}
pub fn packet_type(&self) -> PacketType {
self.header.packet_type
}
pub fn total_size(&self) -> usize {
self.header.length as usize
}
pub fn payload_size(&self) -> usize {
self.payload.len()
}
pub fn is_data(&self) -> bool {
self.header.packet_type == PacketType::Data
}
pub fn is_accept(&self) -> bool {
self.header.packet_type == PacketType::Accept
}
pub fn is_refuse(&self) -> bool {
self.header.packet_type == PacketType::Refuse
}
pub fn is_redirect(&self) -> bool {
self.header.packet_type == PacketType::Redirect
}
pub fn is_marker(&self) -> bool {
self.header.packet_type == PacketType::Marker
}
pub fn is_control(&self) -> bool {
self.header.packet_type == PacketType::Control
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_packet_from_bytes() {
let data = Bytes::from_static(&[
0x00, 0x0a, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x41, 0x42, ]);
let packet = Packet::from_bytes(data).unwrap();
assert_eq!(packet.packet_type(), PacketType::Connect);
assert_eq!(packet.total_size(), 10);
assert_eq!(packet.payload_size(), 2);
assert_eq!(&packet.payload[..], &[0x41, 0x42]);
}
}