traq_bot_http/
events.rs

1//! `enum Event`
2
3use std::{fmt::Display, str::FromStr};
4
5use crate::macros::{all_events, event_converts};
6use crate::payloads::{
7    BotMessageStampsUpdatedPayload, ChannelCreatedPayload, ChannelTopicChangedPayload,
8    DirectMessageCreatedPayload, DirectMessageDeletedPayload, DirectMessageUpdatedPayload,
9    JoinedPayload, LeftPayload, MessageCreatedPayload, MessageDeletedPayload,
10    MessageUpdatedPayload, PingPayload, StampCreatedPayload, TagAddedPayload, TagRemovedPayload,
11    UserCreatedPayload, UserGroupAdminAddedPayload, UserGroupAdminRemovedPayload,
12    UserGroupCreatedPayload, UserGroupDeletedPayload, UserGroupMemberAddedPayload,
13    UserGroupMemberRemovedPayload, UserGroupMemberUpdatedPayload, UserGroupUpdatedPayload,
14};
15
16/// イベント全てを網羅するenum ([non-exhaustive](https://doc.rust-lang.org/reference/attributes/type_system.html))
17///
18/// ## Example
19/// ```
20/// # fn main() -> Result<(), serde_json::Error> {
21/// use traq_bot_http::Event;
22/// use traq_bot_http::payloads::PingPayload;
23/// let payload = r#"{
24///     "eventTime": "2019-05-07T04:50:48.582586882Z"
25/// }"#;
26/// let payload = serde_json::from_str::<PingPayload>(payload)?;
27/// let event = Event::Ping(payload);
28/// # Ok(())
29/// # }
30/// ```
31#[must_use]
32#[derive(Debug, Clone, PartialEq, Eq)]
33#[non_exhaustive]
34pub enum Event {
35    /// ボットの接続確認
36    Ping(PingPayload),
37    /// チャンネルに参加した
38    Joined(JoinedPayload),
39    /// チャンネルから退出した
40    Left(LeftPayload),
41    /// メッセージが作成された
42    MessageCreated(MessageCreatedPayload),
43    /// メッセージが削除された
44    MessageDeleted(MessageDeletedPayload),
45    /// メッセージが更新された
46    MessageUpdated(MessageUpdatedPayload),
47    /// ダイレクトメッセージが作成された
48    DirectMessageCreated(DirectMessageCreatedPayload),
49    /// ダイレクトメッセージが削除された
50    DirectMessageDeleted(DirectMessageDeletedPayload),
51    /// ダイレクトメッセージが更新された
52    DirectMessageUpdated(DirectMessageUpdatedPayload),
53    /// ボットのメッセージにスタンプが付けられた
54    BotMessageStampsUpdated(BotMessageStampsUpdatedPayload),
55    /// チャンネルが作成された
56    ChannelCreated(ChannelCreatedPayload),
57    /// チャンネルのトピックが変更された
58    ChannelTopicChanged(ChannelTopicChangedPayload),
59    /// ユーザーが作成された
60    UserCreated(UserCreatedPayload),
61    /// スタンプが作成された
62    StampCreated(StampCreatedPayload),
63    /// BOTにタグが追加された
64    TagAdded(TagAddedPayload),
65    /// BOTからタグが削除された
66    TagRemoved(TagRemovedPayload),
67    /// ユーザーグループが作成された
68    UserGroupCreated(UserGroupCreatedPayload),
69    /// ユーザーグループが更新された
70    UserGroupUpdated(UserGroupUpdatedPayload),
71    /// ユーザーグループが削除された
72    UserGroupDeleted(UserGroupDeletedPayload),
73    /// ユーザーグループにメンバーが追加された
74    UserGroupMemberAdded(UserGroupMemberAddedPayload),
75    /// ユーザーグループのメンバーが更新された
76    UserGroupMemberUpdated(UserGroupMemberUpdatedPayload),
77    /// ユーザーグループからメンバーが削除された
78    UserGroupMemberRemoved(UserGroupMemberRemovedPayload),
79    /// ユーザーグループに管理者が追加された
80    UserGroupAdminAdded(UserGroupAdminAddedPayload),
81    /// ユーザーグループから管理者が削除された
82    UserGroupAdminRemoved(UserGroupAdminRemovedPayload),
83}
84
85all_events! {event_converts}
86
87/// イベントの種類全てを網羅するenum ([non-exhaustive](https://doc.rust-lang.org/reference/attributes/type_system.html))
88///
89/// ## Example
90/// ```
91/// # fn main() -> Result<(), serde_json::Error> {
92/// use traq_bot_http::{Event, EventKind};
93/// use traq_bot_http::payloads::PingPayload;
94/// let payload = r#"{
95///     "eventTime": "2019-05-07T04:50:48.582586882Z"
96/// }"#;
97/// let payload = serde_json::from_str::<PingPayload>(payload)?;
98/// let event: Event = payload.into();
99/// assert_eq!(event.kind(), EventKind::Ping);
100/// # Ok(())
101/// # }
102/// ```
103#[must_use]
104#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
105#[non_exhaustive]
106pub enum EventKind {
107    /// ボットの接続確認
108    Ping,
109    /// チャンネルに参加した
110    Joined,
111    /// チャンネルから退出した
112    Left,
113    /// メッセージが作成された
114    MessageCreated,
115    /// メッセージが削除された
116    MessageDeleted,
117    /// メッセージが更新された
118    MessageUpdated,
119    /// ダイレクトメッセージが作成された
120    DirectMessageCreated,
121    /// ダイレクトメッセージが削除された
122    DirectMessageDeleted,
123    /// ダイレクトメッセージが更新された
124    DirectMessageUpdated,
125    /// ボットのメッセージにスタンプが付けられた
126    BotMessageStampsUpdated,
127    /// チャンネルが作成された
128    ChannelCreated,
129    /// チャンネルのトピックが変更された
130    ChannelTopicChanged,
131    /// ユーザーが作成された
132    UserCreated,
133    /// スタンプが作成された
134    StampCreated,
135    /// BOTにタグが追加された
136    TagAdded,
137    /// BOTからタグが削除された
138    TagRemoved,
139    /// ユーザーグループが作成された
140    UserGroupCreated,
141    /// ユーザーグループが更新された
142    UserGroupUpdated,
143    /// ユーザーグループが削除された
144    UserGroupDeleted,
145    /// ユーザーグループにメンバーが追加された
146    UserGroupMemberAdded,
147    /// ユーザーグループのメンバーが更新された
148    UserGroupMemberUpdated,
149    /// ユーザーグループからメンバーが削除された
150    UserGroupMemberRemoved,
151    /// ユーザーグループに管理者が追加された
152    UserGroupAdminAdded,
153    /// ユーザーグループから管理者が削除された
154    UserGroupAdminRemoved,
155}
156
157impl Event {
158    pub fn kind(&self) -> EventKind {
159        macro_rules! match_self_to_kind {
160            ($($i:ident),*) => {
161                match_event_to_kind!(self, $($i),*)
162            };
163        }
164
165        use crate::macros::match_event_to_kind;
166
167        all_events!(match_self_to_kind)
168    }
169}
170
171impl Display for EventKind {
172    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
173        macro_rules! match_self_to_str {
174            ($($i:ident),*) => {
175                match_event_kinds_to_str!(self, $($i),*)
176            };
177        }
178
179        use crate::macros::match_event_kinds_to_str;
180
181        let s = all_events!(match_self_to_str);
182        write!(f, "{s}")
183    }
184}
185
186impl FromStr for EventKind {
187    type Err = crate::Error;
188
189    fn from_str(s: &str) -> Result<Self, Self::Err> {
190        macro_rules! match_s_to_event_kinds {
191            ($($i:ident),*) => {
192                match_str_to_event_kinds!(s, $($i),*)
193            };
194        }
195
196        use crate::macros::match_str_to_event_kinds;
197
198        all_events!(match_s_to_event_kinds)
199    }
200}
201
202#[cfg(test)]
203mod tests {
204    use super::*;
205
206    use crate::macros::{all_events, test_event_convert, test_event_to_kind};
207
208    test_event_convert! {"system", Ping}
209
210    test_event_convert! {"system", Joined}
211
212    test_event_convert! {"system", Left}
213
214    test_event_convert! {"message", MessageCreated}
215
216    test_event_convert! {"message", MessageDeleted}
217
218    test_event_convert! {"message", MessageUpdated}
219
220    test_event_convert! {"message", DirectMessageCreated}
221
222    test_event_convert! {"message", DirectMessageDeleted}
223
224    test_event_convert! {"message", DirectMessageUpdated}
225
226    test_event_convert! {"message", BotMessageStampsUpdated}
227
228    test_event_convert! {"channel", ChannelCreated}
229
230    test_event_convert! {"channel", ChannelTopicChanged}
231
232    test_event_convert! {"user", UserCreated}
233
234    test_event_convert! {"stamp", StampCreated}
235
236    test_event_convert! {"tag", TagAdded}
237
238    test_event_convert! {"tag", TagRemoved}
239
240    test_event_convert! {"user-group", UserGroupCreated}
241
242    test_event_convert! {"user-group", UserGroupUpdated}
243
244    test_event_convert! {"user-group", UserGroupDeleted}
245
246    test_event_convert! {"user-group", UserGroupMemberAdded}
247
248    test_event_convert! {"user-group", UserGroupMemberUpdated}
249
250    test_event_convert! {"user-group", UserGroupMemberRemoved}
251
252    test_event_convert! {"user-group", UserGroupAdminAdded}
253
254    test_event_convert! {"user-group", UserGroupAdminRemoved}
255
256    test_event_to_kind! {"system", Ping}
257
258    test_event_to_kind! {"system", Joined}
259
260    test_event_to_kind! {"system", Left}
261
262    test_event_to_kind! {"message", MessageCreated}
263
264    test_event_to_kind! {"message", MessageDeleted}
265
266    test_event_to_kind! {"message", MessageUpdated}
267
268    test_event_to_kind! {"message", DirectMessageCreated}
269
270    test_event_to_kind! {"message", DirectMessageDeleted}
271
272    test_event_to_kind! {"message", DirectMessageUpdated}
273
274    test_event_to_kind! {"message", BotMessageStampsUpdated}
275
276    test_event_to_kind! {"channel", ChannelCreated}
277
278    test_event_to_kind! {"channel", ChannelTopicChanged}
279
280    test_event_to_kind! {"user", UserCreated}
281
282    test_event_to_kind! {"stamp", StampCreated}
283
284    test_event_to_kind! {"tag", TagAdded}
285
286    test_event_to_kind! {"tag", TagRemoved}
287
288    test_event_to_kind! {"user-group", UserGroupCreated}
289
290    test_event_to_kind! {"user-group", UserGroupUpdated}
291
292    test_event_to_kind! {"user-group", UserGroupDeleted}
293
294    test_event_to_kind! {"user-group", UserGroupMemberAdded}
295
296    test_event_to_kind! {"user-group", UserGroupMemberUpdated}
297
298    test_event_to_kind! {"user-group", UserGroupMemberRemoved}
299
300    test_event_to_kind! {"user-group", UserGroupAdminAdded}
301
302    test_event_to_kind! {"user-group", UserGroupAdminRemoved}
303
304    macro_rules! tests_event_kind_from_str {
305        ($($kind:ident),*) => {
306            $( $crate::macros::test_event_kind_from_str! {$kind} )*
307        };
308    }
309
310    all_events! {tests_event_kind_from_str}
311
312    macro_rules! tests_event_kind_to_string {
313        ($($kind:ident),*) => {
314            $( $crate::macros::test_event_kind_to_string! {$kind} )*
315        };
316    }
317
318    all_events! {tests_event_kind_to_string}
319}