use crate::encoding::serialize_bytes;
use crate::encoding::{deserialize_bytes, packetid::PacketId};
use crate::{DeError, Deserialize, Serialize};
use bytes::Bytes;
#[derive(Debug, Clone)]
pub struct RawPacket {
pub packet_id: i32,
pub data: Bytes,
}
impl RawPacket {
pub fn is<T: PacketId>(&self) -> bool {
self.packet_id == T::ID
}
pub fn deserialize_unchecked<T>(&self) -> Result<T, DeError>
where
T: Deserialize + PacketId,
{
let buffer = self.data.clone(); deserialize_bytes(buffer)
}
pub fn deserialize<T>(&self) -> Option<Result<T, DeError>>
where
T: Deserialize + PacketId,
{
self.is::<T>().then(|| self.deserialize_unchecked())
}
}
impl<T: Serialize + PacketId> From<T> for RawPacket {
fn from(value: T) -> Self {
RawPacket {
packet_id: T::ID,
data: serialize_bytes(value),
}
}
}