traq_ws_bot/events/
mod.rs1pub mod common;
2pub mod macros;
3pub mod payload;
4
5use chrono::{DateTime, FixedOffset};
6use paste::paste;
7
8use self::payload::*;
9use serde::{self, Deserialize, Serialize};
10
11pub type Uuid = String;
12pub type Time = DateTime<FixedOffset>;
13
14#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
15#[serde(tag = "type", content = "body")]
16#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
17pub enum Events {
18 Ping(Ping),
19 Joined(Joined),
20 Left(Left),
21 MessageCreated(MessageCreated),
22 MessageUpdated(MessageUpdated),
23 MessageDeleted(MessageDeleted),
24 BotMessageStampsUpdated(BotMessageStampsUpdated),
25 DirectMessageCreated(DirectMessageCreated),
26 DirectMessageUpdated(DirectMessageUpdated),
27 DirectMessageDeleted(DirectMessageDeleted),
28 ChannelCreated(ChannelCreated),
29 ChannelTopicChanged(ChannelTopicChanged),
30 UserCreated(UserCreated),
31 StampCreated(StampCreated),
32 TagAdded(TagAdded),
33 TagRemoved(TagRemoved),
34 Error(String),
35}
36
37macro_rules! from_inner {
38 ($($name:ident),*$(,)?) => {
39 paste! {
40 $(
41 impl From<[<$name:camel>]> for Events {
42 fn from([<$name:snake>]: [<$name:camel>]) -> Self {
43 Events::$name([<$name:snake>])
44 }
45 }
46 )*
47 }
48 };
49}
50
51from_inner!(
52 Ping,
53 Joined,
54 Left,
55 MessageCreated,
56 MessageUpdated,
57 MessageDeleted,
58 BotMessageStampsUpdated,
59 DirectMessageCreated,
60 DirectMessageUpdated,
61 DirectMessageDeleted,
62 ChannelCreated,
63 ChannelTopicChanged,
64 UserCreated,
65 StampCreated,
66 TagAdded,
67 TagRemoved,
68);
69
70macro_rules! try_from_to_inner {
71 ($($name:ident),*$(,)?) => {
72 paste! {
73 $(
74 impl TryFrom<Events> for [<$name:camel>] {
75 type Error = ();
76 fn try_from(event: Events) -> Result<Self, Self::Error> {
77 match event {
78 Events::[<$name:camel>]([<$name:snake>]) => Ok([<$name:snake>]),
79 _ => Err(()),
80 }
81 }
82 }
83 impl<'a> TryFrom<&'a Events> for &'a [<$name:camel>] {
84 type Error = ();
85 fn try_from(event: &'a Events) -> Result<Self, Self::Error> {
86 match event {
87 Events::[<$name:camel>]([<$name:snake>]) => Ok([<$name:snake>]),
88 _ => Err(()),
89 }
90 }
91 }
92 )*
93 }
94 };
95}
96
97try_from_to_inner!(
98 Ping,
99 Joined,
100 Left,
101 MessageCreated,
102 MessageUpdated,
103 MessageDeleted,
104 BotMessageStampsUpdated,
105 DirectMessageCreated,
106 DirectMessageUpdated,
107 DirectMessageDeleted,
108 ChannelCreated,
109 ChannelTopicChanged,
110 UserCreated,
111 StampCreated,
112 TagAdded,
113 TagRemoved,
114);