twilight_model/channel/message/
activity.rs

1use serde::{Deserialize, Serialize};
2
3/// Activity associated with a message.
4#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
5pub struct MessageActivity {
6    /// [`MessageActivityType`]
7    #[serde(rename = "type")]
8    pub kind: MessageActivityType,
9    /// ID of the player's party, lobby or group.
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub party_id: Option<String>,
12}
13
14/// Activity of this message.
15#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
16#[non_exhaustive]
17#[serde(from = "u8", into = "u8")]
18pub enum MessageActivityType {
19    /// Join the the party.
20    Join,
21    /// Spectate on or with the party.
22    Spectate,
23    /// Listen to or with the party.
24    Listen,
25    /// Request to join the party.
26    JoinRequest,
27    /// Variant value is unknown to the library.
28    Unknown(u8),
29}
30
31impl From<u8> for MessageActivityType {
32    fn from(value: u8) -> Self {
33        match value {
34            1 => Self::Join,
35            2 => Self::Spectate,
36            3 => Self::Listen,
37            5 => Self::JoinRequest,
38            unknown => Self::Unknown(unknown),
39        }
40    }
41}
42
43impl From<MessageActivityType> for u8 {
44    fn from(value: MessageActivityType) -> Self {
45        match value {
46            MessageActivityType::Join => 1,
47            MessageActivityType::Spectate => 2,
48            MessageActivityType::Listen => 3,
49            MessageActivityType::JoinRequest => 5,
50            MessageActivityType::Unknown(unknown) => unknown,
51        }
52    }
53}
54
55#[cfg(test)]
56mod tests {
57    use super::{MessageActivity, MessageActivityType};
58    use serde_test::Token;
59
60    #[test]
61    fn message_activity() {
62        let value = MessageActivity {
63            kind: MessageActivityType::Join,
64            party_id: None,
65        };
66
67        serde_test::assert_tokens(
68            &value,
69            &[
70                Token::Struct {
71                    name: "MessageActivity",
72                    len: 1,
73                },
74                Token::Str("type"),
75                Token::U8(1),
76                Token::StructEnd,
77            ],
78        );
79    }
80
81    #[test]
82    fn message_activity_complete() {
83        let value = MessageActivity {
84            kind: MessageActivityType::Join,
85            party_id: Some("test".to_owned()),
86        };
87
88        serde_test::assert_tokens(
89            &value,
90            &[
91                Token::Struct {
92                    name: "MessageActivity",
93                    len: 2,
94                },
95                Token::Str("type"),
96                Token::U8(1),
97                Token::Str("party_id"),
98                Token::Some,
99                Token::Str("test"),
100                Token::StructEnd,
101            ],
102        );
103    }
104
105    #[test]
106    fn variants() {
107        serde_test::assert_tokens(&MessageActivityType::Join, &[Token::U8(1)]);
108        serde_test::assert_tokens(&MessageActivityType::Spectate, &[Token::U8(2)]);
109        serde_test::assert_tokens(&MessageActivityType::Listen, &[Token::U8(3)]);
110        serde_test::assert_tokens(&MessageActivityType::JoinRequest, &[Token::U8(5)]);
111        serde_test::assert_tokens(&MessageActivityType::Unknown(99), &[Token::U8(99)]);
112    }
113}