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
use std::any::Any;

use naia_serde::BitWrite;

use crate::{EntityHandle, Message, MessageKind, MessageKinds, NetEntityHandleConverter};

#[derive(Clone)]
pub struct MessageContainer {
    inner: Box<dyn Message>,
    bit_length: u32,
}

impl MessageContainer {
    pub fn from(message: Box<dyn Message>) -> Self {
        let bit_length = message.bit_length();
        Self {
            inner: message,
            bit_length,
        }
    }

    pub fn name(&self) -> String {
        self.inner.name()
    }

    pub fn bit_length(&self) -> u32 {
        self.bit_length
    }

    pub fn write(
        &self,
        message_kinds: &MessageKinds,
        writer: &mut dyn BitWrite,
        converter: &dyn NetEntityHandleConverter,
    ) {
        if writer.is_counter() {
            writer.write_bits(self.bit_length);
        } else {
            self.inner.write(message_kinds, writer, converter);
        }
    }

    pub fn has_entity_properties(&self) -> bool {
        return self.inner.has_entity_properties();
    }

    pub fn entities(&self) -> Vec<EntityHandle> {
        return self.inner.entities();
    }

    pub fn is_fragment(&self) -> bool {
        return self.inner.is_fragment();
    }

    pub fn to_boxed_any(self) -> Box<dyn Any> {
        return self.inner.to_boxed_any();
    }

    pub fn kind(&self) -> MessageKind {
        return self.inner.kind();
    }
}