use core::any::TypeId;
use bevy::prelude::*;
use super::{
client_event::ClientEvent, client_message::ClientMessage, server_event::ServerEvent,
server_message::ServerMessage, shared_event::SharedEvent, shared_message::SharedMessage,
};
#[derive(Resource, Default)]
pub struct RemoteMessageRegistry {
server_messages: Vec<ServerMessage>,
client_messages: Vec<ClientMessage>,
shared_messages: Vec<SharedMessage>,
server_events: Vec<ServerEvent>,
client_events: Vec<ClientEvent>,
shared_events: Vec<SharedEvent>,
}
impl RemoteMessageRegistry {
pub(super) fn register_server_message(&mut self, message: ServerMessage) {
self.server_messages.push(message);
}
pub(super) fn register_client_message(&mut self, message: ClientMessage) {
self.client_messages.push(message);
}
pub(super) fn register_shared_message(&mut self, message: SharedMessage) {
self.shared_messages.push(message);
}
pub(super) fn register_server_event(&mut self, event: ServerEvent) {
self.server_events.push(event);
}
pub(super) fn register_client_event(&mut self, event: ClientEvent) {
self.client_events.push(event);
}
pub(super) fn register_shared_event(&mut self, event: SharedEvent) {
self.shared_events.push(event);
}
pub(super) fn iter_server_messages_mut(&mut self) -> impl Iterator<Item = &mut ServerMessage> {
self.server_messages.iter_mut()
}
pub(super) fn iter_server_events_mut(&mut self) -> impl Iterator<Item = &mut ServerEvent> {
self.server_events.iter_mut()
}
pub(crate) fn iter_all_server(&self) -> impl Iterator<Item = &ServerMessage> {
self.server_messages
.iter()
.chain(self.server_events.iter().map(|e| e.message()))
}
pub(crate) fn iter_all_client(&self) -> impl Iterator<Item = &ClientMessage> {
self.client_messages
.iter()
.chain(self.client_events.iter().map(|e| e.message()))
}
pub(crate) fn iter_all_shared(&self) -> impl Iterator<Item = &SharedMessage> {
self.shared_messages
.iter()
.chain(self.shared_events.iter().map(|e| e.message()))
}
pub(crate) fn iter_server_events(&self) -> impl Iterator<Item = &ServerEvent> {
self.server_events.iter()
}
pub(crate) fn iter_client_events(&self) -> impl Iterator<Item = &ClientEvent> {
self.client_events.iter()
}
pub(crate) fn iter_shared_events(&self) -> impl Iterator<Item = &SharedEvent> {
self.shared_events.iter()
}
pub fn server_message_channel<M: Message>(&self) -> Option<usize> {
self.server_messages
.iter()
.find(|m| m.type_id() == TypeId::of::<M>())
.map(|m| m.channel_id())
}
pub fn server_event_channel<E: Event>(&self) -> Option<usize> {
self.server_events
.iter()
.find(|e| e.type_id() == TypeId::of::<E>())
.map(|e| e.message().channel_id())
}
pub fn client_message_channel<M: Message>(&self) -> Option<usize> {
self.client_messages
.iter()
.find(|m| m.type_id() == TypeId::of::<M>())
.map(|m| m.channel_id())
}
pub fn client_event_channel<E: Event>(&self) -> Option<usize> {
self.client_events
.iter()
.find(|e| e.type_id() == TypeId::of::<E>())
.map(|e| e.message().channel_id())
}
pub fn shared_message_channel<M: Message>(&self) -> Option<usize> {
self.shared_messages
.iter()
.find(|m| m.type_id() == TypeId::of::<M>())
.map(|m| m.channel_id())
}
pub fn shared_event_channel<E: Event>(&self) -> Option<usize> {
self.shared_events
.iter()
.find(|e| e.type_id() == TypeId::of::<E>())
.map(|e| e.message().channel_id())
}
}