traq_ws_bot/events/
mod.rs

1pub 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);