use bevy::prelude::*;
use bytes::Bytes;
use log::trace;
#[derive(Resource, Default)]
pub struct ClientMessages {
received_messages: Vec<Vec<Bytes>>,
sent_messages: Vec<(usize, Bytes)>,
}
impl ClientMessages {
pub(crate) fn setup_server_channels(&mut self, channels_count: usize) {
self.received_messages.resize(channels_count, Vec::new());
}
pub fn received_count<I: Into<usize>>(&self, channel_id: I) -> usize {
let channel_id = channel_id.into();
let channel_messages = self
.received_messages
.get(channel_id)
.unwrap_or_else(|| panic!("client should have a receive channel with id {channel_id}"));
channel_messages.len()
}
pub(crate) fn receive<I: Into<usize>>(
&mut self,
channel_id: I,
) -> impl Iterator<Item = Bytes> + '_ {
let channel_id = channel_id.into();
let channel_messages = self
.received_messages
.get_mut(channel_id)
.unwrap_or_else(|| panic!("client should have a receive channel with id {channel_id}"));
if !channel_messages.is_empty() {
trace!(
"received {} message(s) totaling {} bytes from channel {channel_id}",
channel_messages.len(),
channel_messages
.iter()
.map(|bytes| bytes.len())
.sum::<usize>()
);
}
channel_messages.drain(..)
}
pub fn send<I: Into<usize>, B: Into<Bytes>>(&mut self, channel_id: I, message: B) {
let channel_id = channel_id.into();
let message: Bytes = message.into();
trace!("sending {} bytes over channel {channel_id}", message.len());
self.sent_messages.push((channel_id, message));
}
pub(crate) fn clear(&mut self) {
for channel_messages in &mut self.received_messages {
channel_messages.clear();
}
self.sent_messages.clear();
}
pub fn drain_sent(&mut self) -> impl Iterator<Item = (usize, Bytes)> + '_ {
self.sent_messages.drain(..)
}
pub fn insert_received<I: Into<usize>, B: Into<Bytes>>(&mut self, channel_id: I, message: B) {
let channel_id = channel_id.into();
let channel_messages = self
.received_messages
.get_mut(channel_id)
.unwrap_or_else(|| panic!("client should have a channel with id {channel_id}"));
channel_messages.push(message.into());
}
}