libtw2_gamenet_common/
traits.rs1use 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}