use dashmap::DashMap;
use serde::{de::DeserializeOwned, Serialize};
pub trait Packet: DeserializeOwned + Serialize + Sync + Send + 'static {
const ID: u32;
}
#[macro_export]
macro_rules! impl_packet {
($t:ty) => {
impl ::bevnet::Packet for $t {
const ID: u32 = ::const_fnv1a_hash::fnv1a_hash_32(
concat!(module_path!(), "::", stringify!($t)).as_bytes(),
None,
);
}
};
}
pub struct PacketReceiver {
data: DashMap<u32, Vec<Vec<u8>>>,
}
impl PacketReceiver {
pub fn new() -> Self {
Self {
data: DashMap::new(),
}
}
pub fn clear(&self) {
self.data.clear();
}
pub fn insert(&self, id: u32, data: Vec<u8>) {
self.data.entry(id).or_default().push(data);
}
pub fn extract<P: Packet>(&self) -> Vec<P> {
match self.data.get_mut(&P::ID) {
Some(mut data) => data
.value_mut()
.drain(..)
.filter_map(|data| bincode::deserialize(&data).ok())
.collect(),
None => Vec::new(),
}
}
}