naia_shared/messages/
message.rs1use std::{any::Any, collections::HashSet};
2
3use naia_serde::{BitReader, BitWrite, SerdeErr};
4
5use crate::{
6 messages::message_kinds::{MessageKind, MessageKinds},
7 named::Named,
8 world::entity::entity_converters::LocalEntityAndGlobalEntityConverterMut,
9 LocalEntityAndGlobalEntityConverter, MessageContainer, RemoteEntity,
10};
11
12pub trait MessageBuilder: Send + Sync {
14 fn read(
16 &self,
17 reader: &mut BitReader,
18 converter: &dyn LocalEntityAndGlobalEntityConverter,
19 ) -> Result<MessageContainer, SerdeErr>;
20
21 fn box_clone(&self) -> Box<dyn MessageBuilder>;
23}
24
25pub trait Message: Send + Sync + Named + MessageClone + Any {
27 fn kind(&self) -> MessageKind;
29 fn to_boxed_any(self: Box<Self>) -> Box<dyn Any>;
31 fn create_builder() -> Box<dyn MessageBuilder>
33 where
34 Self: Sized;
35 fn bit_length(
37 &self,
38 message_kinds: &MessageKinds,
39 converter: &mut dyn LocalEntityAndGlobalEntityConverterMut,
40 ) -> u32;
41 fn is_fragment(&self) -> bool;
43 fn is_request(&self) -> bool;
45 fn write(
47 &self,
48 message_kinds: &MessageKinds,
49 writer: &mut dyn BitWrite,
50 converter: &mut dyn LocalEntityAndGlobalEntityConverterMut,
51 );
52 fn relations_waiting(&self) -> Option<HashSet<RemoteEntity>>;
54 fn relations_complete(&mut self, converter: &dyn LocalEntityAndGlobalEntityConverter);
56 }
61
62impl Named for Box<dyn Message> {
64 fn name(&self) -> String {
65 self.as_ref().name()
66 }
67
68 fn protocol_name() -> &'static str
69 where
70 Self: Sized,
71 {
72 unimplemented!("protocol_name() is not available for Box<dyn Message>")
74 }
75}
76
77pub trait MessageClone {
79 fn clone_box(&self) -> Box<dyn Message>;
81}
82
83impl<T: 'static + Clone + Message> MessageClone for T {
84 fn clone_box(&self) -> Box<dyn Message> {
85 Box::new(self.clone())
86 }
87}
88
89impl Clone for Box<dyn Message> {
90 fn clone(&self) -> Box<dyn Message> {
91 MessageClone::clone_box(self.as_ref())
92 }
93}