use bevy::prelude::*; use uuid::Uuid; #[derive(Debug)] pub enum TryFromBytesError { InsufficientLength, NotUUID, } pub const UUID_SIZE: usize = 16; #[derive(Clone, Debug)] pub struct Packet { pub peer: Uuid, pub message: Vec, } impl Packet { pub fn create>(peer: Uuid, message: Vec) -> T { Self { peer, message }.into() } } impl TryFrom> for Packet { type Error = TryFromBytesError; fn try_from(mut value: Vec) -> std::result::Result { if value.len() < UUID_SIZE { return Err(TryFromBytesError::InsufficientLength); } let message = value.split_off(UUID_SIZE); let uuid = Uuid::from_slice(value.as_slice()).map_err(|_| TryFromBytesError::NotUUID)?; Ok(Packet::create(uuid, message)) } } #[derive(Debug, Message)] pub struct OutboundPacket(pub Packet); impl From for OutboundPacket { fn from(value: Packet) -> Self { Self(value) } } #[derive(Debug, Message)] pub struct InboundPacket(pub Packet); impl From for InboundPacket { fn from(value: Packet) -> Self { Self(value) } }