insim/insim/
iii.rs

1use crate::identifiers::{ConnectionId, PlayerId, RequestId};
2
3#[derive(Debug, Clone, Default, insim_core::Decode, insim_core::Encode)]
4#[cfg_attr(feature = "serde", derive(serde::Serialize))]
5/// InsIm Info -  a /i message from user to hosts Insim
6pub struct Iii {
7    #[insim(pad_after = 1)]
8    /// Non-zero if the packet is a packet request or a reply to a request
9    pub reqi: RequestId,
10
11    /// Unique connection ID that the message was received from
12    pub ucid: ConnectionId,
13
14    /// Unique player iD that the message was received from
15    #[insim(pad_after = 2)]
16    pub plid: PlayerId,
17
18    /// The message
19    #[insim(codepage(length = 64, align_to = 4, trailing_nul = true))]
20    pub msg: String,
21}
22
23#[cfg(test)]
24mod test {
25    use bytes::BytesMut;
26
27    use super::*;
28
29    #[test]
30    fn test_iii() {
31        let mut raw = BytesMut::new();
32        raw.extend_from_slice(&[
33            0, // reqi
34            0, // zero
35            2, // ucid
36            4, // plid
37            0, // sp2
38            0, // sp3
39        ]);
40        raw.extend_from_slice(b"abcd");
41
42        assert_from_to_bytes!(Iii, raw.freeze(), |parsed: Iii| {
43            assert_eq!(parsed.reqi, RequestId(0));
44            assert_eq!(parsed.ucid, ConnectionId(2));
45            assert_eq!(parsed.plid, PlayerId(4));
46            assert_eq!(parsed.msg, "abcd");
47        });
48    }
49}