twilight_model/channel/message/
reaction_type.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
4#[non_exhaustive]
5#[serde(from = "u8", into = "u8")]
6/// The kind of reaction.
7pub enum ReactionType {
8    /// A non-burst/super reaction.
9    Normal,
10    /// A super reaction.
11    Burst,
12    /// An unknown reaction type.
13    Unknown(u8),
14}
15
16impl From<u8> for ReactionType {
17    fn from(value: u8) -> Self {
18        match value {
19            0 => Self::Normal,
20            1 => Self::Burst,
21            unknown => Self::Unknown(unknown),
22        }
23    }
24}
25
26impl From<ReactionType> for u8 {
27    fn from(value: ReactionType) -> Self {
28        match value {
29            ReactionType::Normal => 0,
30            ReactionType::Burst => 1,
31            ReactionType::Unknown(unknown) => unknown,
32        }
33    }
34}
35
36impl ReactionType {
37    /// The name of the reaction type.
38    pub const fn name(self) -> &'static str {
39        match self {
40            Self::Normal => "Normal",
41            Self::Burst => "Burst",
42            Self::Unknown(_) => "Unknown",
43        }
44    }
45}
46
47#[cfg(test)]
48mod tests {
49    use super::ReactionType;
50    use serde_test::Token;
51
52    #[test]
53    fn variants() {
54        serde_test::assert_tokens(&ReactionType::Normal, &[Token::U8(0)]);
55        serde_test::assert_tokens(&ReactionType::Burst, &[Token::U8(1)]);
56        serde_test::assert_tokens(&ReactionType::Unknown(255), &[Token::U8(255)]);
57    }
58
59    #[test]
60    fn names() {
61        assert_eq!(ReactionType::Normal.name(), "Normal");
62        assert_eq!(ReactionType::Burst.name(), "Burst");
63        assert_eq!(ReactionType::Unknown(255).name(), "Unknown");
64    }
65}