twilight_model/channel/message/
reference_type.rs

1use serde::{Deserialize, Serialize};
2
3/// The type of reference for a message.
4#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, Hash, PartialEq, Serialize)]
5#[non_exhaustive]
6#[serde(from = "u8", into = "u8")]
7pub enum MessageReferenceType {
8    /// A standard reference used by replies.
9    #[default]
10    Default,
11    /// Reference used to point to a message at a point in time.
12    Forward,
13    /// An unknown message reference type.
14    Unknown(u8),
15}
16
17impl From<u8> for MessageReferenceType {
18    fn from(value: u8) -> Self {
19        match value {
20            0 => MessageReferenceType::Default,
21            1 => MessageReferenceType::Forward,
22            other => MessageReferenceType::Unknown(other),
23        }
24    }
25}
26
27impl From<MessageReferenceType> for u8 {
28    fn from(value: MessageReferenceType) -> Self {
29        match value {
30            MessageReferenceType::Default => 0,
31            MessageReferenceType::Forward => 1,
32            MessageReferenceType::Unknown(other) => other,
33        }
34    }
35}
36
37impl MessageReferenceType {
38    /// Return a string representation of the type.
39    pub const fn name(&self) -> &str {
40        match self {
41            Self::Default => "Default",
42            Self::Forward => "Forward",
43            Self::Unknown(_) => "Unknown",
44        }
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::MessageReferenceType;
51    use serde::{Deserialize, Serialize};
52    use serde_test::Token;
53    use static_assertions::assert_impl_all;
54    use std::{fmt::Debug, hash::Hash};
55
56    assert_impl_all!(
57        MessageReferenceType: Clone,
58        Copy,
59        Debug,
60        Deserialize<'static>,
61        Eq,
62        Hash,
63        PartialEq,
64        Serialize,
65        Send,
66        Sync,
67    );
68
69    #[test]
70    fn variants() {
71        serde_test::assert_tokens(&MessageReferenceType::Default, &[Token::U8(0)]);
72        serde_test::assert_tokens(&MessageReferenceType::Forward, &[Token::U8(1)]);
73        serde_test::assert_tokens(&MessageReferenceType::Unknown(99), &[Token::U8(99)]);
74    }
75
76    #[test]
77    fn names() {
78        assert_eq!(MessageReferenceType::Default.name(), "Default");
79        assert_eq!(MessageReferenceType::Forward.name(), "Forward");
80        assert_eq!(MessageReferenceType::Unknown(99).name(), "Unknown");
81    }
82
83    #[test]
84    fn default() {
85        assert_eq!(
86            MessageReferenceType::Default,
87            MessageReferenceType::default()
88        );
89    }
90}