1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use std::any::Any;
use naia_serde::{BitReader, BitWrite, SerdeErr};
use crate::{
messages::{
message_kinds::{MessageKind, MessageKinds},
named::Named,
},
EntityHandle, MessageContainer, NetEntityHandleConverter,
};
pub trait MessageBuilder: Send + Sync {
fn read(
&self,
reader: &mut BitReader,
converter: &dyn NetEntityHandleConverter,
) -> 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) -> u32;
fn is_fragment(&self) -> bool;
fn write(
&self,
message_kinds: &MessageKinds,
writer: &mut dyn BitWrite,
converter: &dyn NetEntityHandleConverter,
);
fn has_entity_properties(&self) -> bool;
fn entities(&self) -> Vec<EntityHandle>;
}
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())
}
}