1use 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#[must_use]
32#[derive(Debug, Clone, PartialEq, Eq)]
33#[non_exhaustive]
34pub enum Event {
35 Ping(PingPayload),
37 Joined(JoinedPayload),
39 Left(LeftPayload),
41 MessageCreated(MessageCreatedPayload),
43 MessageDeleted(MessageDeletedPayload),
45 MessageUpdated(MessageUpdatedPayload),
47 DirectMessageCreated(DirectMessageCreatedPayload),
49 DirectMessageDeleted(DirectMessageDeletedPayload),
51 DirectMessageUpdated(DirectMessageUpdatedPayload),
53 BotMessageStampsUpdated(BotMessageStampsUpdatedPayload),
55 ChannelCreated(ChannelCreatedPayload),
57 ChannelTopicChanged(ChannelTopicChangedPayload),
59 UserCreated(UserCreatedPayload),
61 StampCreated(StampCreatedPayload),
63 TagAdded(TagAddedPayload),
65 TagRemoved(TagRemovedPayload),
67 UserGroupCreated(UserGroupCreatedPayload),
69 UserGroupUpdated(UserGroupUpdatedPayload),
71 UserGroupDeleted(UserGroupDeletedPayload),
73 UserGroupMemberAdded(UserGroupMemberAddedPayload),
75 UserGroupMemberUpdated(UserGroupMemberUpdatedPayload),
77 UserGroupMemberRemoved(UserGroupMemberRemovedPayload),
79 UserGroupAdminAdded(UserGroupAdminAddedPayload),
81 UserGroupAdminRemoved(UserGroupAdminRemovedPayload),
83}
84
85all_events! {event_converts}
86
87#[must_use]
104#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
105#[non_exhaustive]
106pub enum EventKind {
107 Ping,
109 Joined,
111 Left,
113 MessageCreated,
115 MessageDeleted,
117 MessageUpdated,
119 DirectMessageCreated,
121 DirectMessageDeleted,
123 DirectMessageUpdated,
125 BotMessageStampsUpdated,
127 ChannelCreated,
129 ChannelTopicChanged,
131 UserCreated,
133 StampCreated,
135 TagAdded,
137 TagRemoved,
139 UserGroupCreated,
141 UserGroupUpdated,
143 UserGroupDeleted,
145 UserGroupMemberAdded,
147 UserGroupMemberUpdated,
149 UserGroupMemberRemoved,
151 UserGroupAdminAdded,
153 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}