use std::{any::Any, collections::HashSet};
use naia_serde::{BitReader, BitWrite, SerdeErr};
use crate::{
messages::{
message_kinds::{MessageKind, MessageKinds},
named::Named,
},
world::entity::entity_converters::LocalEntityAndGlobalEntityConverterMut,
LocalEntityAndGlobalEntityConverter, MessageContainer, RemoteEntity,
};
pub trait MessageBuilder: Send + Sync {
fn read(
&self,
reader: &mut BitReader,
converter: &dyn LocalEntityAndGlobalEntityConverter,
) -> Result<MessageContainer, SerdeErr>;
}
pub trait Message: Send + Sync + Named + MessageClone + Any {
fn kind(&self) -> MessageKind;
fn to_boxed_any(self: Box<Self>) -> Box<dyn Any>;
fn create_builder() -> Box<dyn MessageBuilder>
where
Self: Sized;
fn bit_length(&self, converter: &mut dyn LocalEntityAndGlobalEntityConverterMut) -> u32;
fn is_fragment(&self) -> bool;
fn is_request(&self) -> bool;
fn write(
&self,
message_kinds: &MessageKinds,
writer: &mut dyn BitWrite,
converter: &mut dyn LocalEntityAndGlobalEntityConverterMut,
);
fn relations_waiting(&self) -> Option<HashSet<RemoteEntity>>;
fn relations_complete(&mut self, converter: &dyn LocalEntityAndGlobalEntityConverter);
}
impl Named for Box<dyn Message> {
fn name(&self) -> String {
self.as_ref().name()
}
}
pub trait MessageClone {
fn clone_box(&self) -> Box<dyn Message>;
}
impl<T: 'static + Clone + Message> MessageClone for T {
fn clone_box(&self) -> Box<dyn Message> {
Box::new(self.clone())
}
}
impl Clone for Box<dyn Message> {
fn clone(&self) -> Box<dyn Message> {
MessageClone::clone_box(self.as_ref())
}
}