libtw2_gamenet_common/
traits.rs

1use crate::error::Error;
2use crate::msg::MessageId;
3use crate::msg::SystemOrGame;
4use crate::snap_obj;
5use buffer::CapacityError;
6use libtw2_packer::with_packer;
7use libtw2_packer::ExcessData;
8use libtw2_packer::IntUnpacker;
9use libtw2_packer::Packer;
10use libtw2_packer::Unpacker;
11use libtw2_packer::Warning;
12use warn::Warn;
13
14pub trait SnapObj: Sized {
15    fn decode_obj<W: Warn<ExcessData>>(
16        warn: &mut W,
17        obj_type_id: snap_obj::TypeId,
18        p: &mut IntUnpacker,
19    ) -> Result<Self, Error>;
20    fn obj_type_id(&self) -> snap_obj::TypeId;
21    fn encode(&self) -> &[i32];
22}
23
24pub trait Message<'a>: Sized {
25    fn decode_msg<W: Warn<Warning>>(
26        warn: &mut W,
27        msg_id: SystemOrGame<MessageId, MessageId>,
28        p: &mut Unpacker<'a>,
29    ) -> Result<Self, Error>;
30    fn msg_id(&self) -> SystemOrGame<MessageId, MessageId>;
31    fn encode_msg<'d, 's>(&self, p: Packer<'d, 's>) -> Result<&'d [u8], CapacityError>;
32}
33
34pub trait MessageExt<'a>: Message<'a> {
35    fn decode<W: Warn<Warning>>(warn: &mut W, p: &mut Unpacker<'a>) -> Result<Self, Error> {
36        let msg_id = SystemOrGame::decode_id(warn, p)?;
37        Self::decode_msg(warn, msg_id, p)
38    }
39    fn encode<'d, 's>(&self, mut p: Packer<'d, 's>) -> Result<&'d [u8], CapacityError> {
40        with_packer(&mut p, |p| self.msg_id().encode_id(p))?;
41        with_packer(&mut p, |p| self.encode_msg(p))?;
42        Ok(p.written())
43    }
44}
45
46impl<'a, T: Message<'a>> MessageExt<'a> for T {}
47
48pub trait ProtocolStatic {
49    type SnapObj: SnapObj + 'static;
50    fn obj_size(type_id: u16) -> Option<u32>;
51}
52
53pub trait Protocol<'a>: ProtocolStatic {
54    type Game: Message<'a>;
55    type System: Message<'a>;
56}