use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum ChannelType {
Text = 1,
Group = 2,
Dm = 3,
GmeetVoice = 4,
Forum = 5,
Streaming = 6,
Thread = 7,
App = 8,
Announcement = 9,
Voice = 10,
}
impl From<ChannelType> for i32 {
fn from(c: ChannelType) -> i32 {
c as i32
}
}
impl TryFrom<i32> for ChannelType {
type Error = i32;
fn try_from(v: i32) -> Result<Self, Self::Error> {
match v {
1 => Ok(Self::Text),
2 => Ok(Self::Group),
3 => Ok(Self::Dm),
4 => Ok(Self::GmeetVoice),
5 => Ok(Self::Forum),
6 => Ok(Self::Streaming),
7 => Ok(Self::Thread),
8 => Ok(Self::App),
9 => Ok(Self::Announcement),
10 => Ok(Self::Voice),
_ => Err(v),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[repr(i32)]
#[non_exhaustive]
pub enum MessageCode {
Chat = 0,
Update = 1,
Remove = 2,
Typing = 3,
CreateThread = 6,
CreatePin = 7,
MessageBuzz = 8,
Topic = 9,
SendToken = 11,
Ephemeral = 12,
Poll = 18,
}
impl From<MessageCode> for i32 {
fn from(c: MessageCode) -> i32 {
c as i32
}
}
impl TryFrom<i32> for MessageCode {
type Error = i32;
fn try_from(v: i32) -> Result<Self, Self::Error> {
match v {
0 => Ok(Self::Chat),
1 => Ok(Self::Update),
2 => Ok(Self::Remove),
3 => Ok(Self::Typing),
6 => Ok(Self::CreateThread),
7 => Ok(Self::CreatePin),
8 => Ok(Self::MessageBuzz),
9 => Ok(Self::Topic),
11 => Ok(Self::SendToken),
12 => Ok(Self::Ephemeral),
18 => Ok(Self::Poll),
_ => Err(v),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum StreamMode {
Channel = 2,
Group = 3,
Dm = 4,
Clan = 5,
Thread = 6,
}
impl From<StreamMode> for i32 {
fn from(m: StreamMode) -> i32 {
m as i32
}
}
impl TryFrom<i32> for StreamMode {
type Error = i32;
fn try_from(v: i32) -> Result<Self, Self::Error> {
match v {
2 => Ok(Self::Channel),
3 => Ok(Self::Group),
4 => Ok(Self::Dm),
5 => Ok(Self::Clan),
6 => Ok(Self::Thread),
_ => Err(v),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn channel_type_roundtrip() {
let ct = ChannelType::Dm;
let raw: i32 = ct.into();
assert_eq!(raw, 3);
assert_eq!(ChannelType::try_from(3), Ok(ChannelType::Dm));
}
#[test]
fn stream_mode_roundtrip() {
let sm = StreamMode::Thread;
let raw: i32 = sm.into();
assert_eq!(raw, 6);
assert_eq!(StreamMode::try_from(6), Ok(StreamMode::Thread));
}
#[test]
fn message_code_roundtrip() {
let mc = MessageCode::Ephemeral;
let raw: i32 = mc.into();
assert_eq!(raw, 12);
assert_eq!(MessageCode::try_from(12), Ok(MessageCode::Ephemeral));
}
#[test]
fn unknown_values_return_err() {
assert!(ChannelType::try_from(999).is_err());
assert!(StreamMode::try_from(0).is_err());
assert!(MessageCode::try_from(99).is_err());
}
}