twilight_model/gateway/event/
dispatch.rs

1use super::{super::payload::incoming::*, Event, EventConversionError, EventType};
2use serde::{
3    Serialize,
4    de::{Deserialize, DeserializeSeed, Deserializer, Error as DeError, IgnoredAny},
5};
6
7/// A dispatch event, containing information about a created guild, a member
8/// added, etc.
9///
10/// You can deserialize into a `DispatchEvent` via
11/// [`DispatchEventWithTypeDeserializer`].
12// **NOTE**: When adding a variant, be sure to add it to the DeserializeSeed
13// implementation.
14#[derive(Clone, Debug, PartialEq, Serialize)]
15#[serde(untagged)]
16pub enum DispatchEvent {
17    AutoModerationActionExecution(AutoModerationActionExecution),
18    AutoModerationRuleCreate(AutoModerationRuleCreate),
19    AutoModerationRuleDelete(AutoModerationRuleDelete),
20    AutoModerationRuleUpdate(AutoModerationRuleUpdate),
21    BanAdd(BanAdd),
22    BanRemove(BanRemove),
23    ChannelCreate(Box<ChannelCreate>),
24    ChannelDelete(Box<ChannelDelete>),
25    ChannelPinsUpdate(ChannelPinsUpdate),
26    ChannelUpdate(Box<ChannelUpdate>),
27    CommandPermissionsUpdate(CommandPermissionsUpdate),
28    EntitlementCreate(EntitlementCreate),
29    EntitlementDelete(EntitlementDelete),
30    EntitlementUpdate(EntitlementUpdate),
31    GuildAuditLogEntryCreate(Box<GuildAuditLogEntryCreate>),
32    GuildCreate(Box<GuildCreate>),
33    GuildDelete(GuildDelete),
34    GuildEmojisUpdate(GuildEmojisUpdate),
35    GuildIntegrationsUpdate(GuildIntegrationsUpdate),
36    GuildScheduledEventCreate(Box<GuildScheduledEventCreate>),
37    GuildScheduledEventDelete(Box<GuildScheduledEventDelete>),
38    GuildScheduledEventUpdate(Box<GuildScheduledEventUpdate>),
39    GuildScheduledEventUserAdd(GuildScheduledEventUserAdd),
40    GuildScheduledEventUserRemove(GuildScheduledEventUserRemove),
41    GuildStickersUpdate(GuildStickersUpdate),
42    GuildUpdate(Box<GuildUpdate>),
43    IntegrationCreate(Box<IntegrationCreate>),
44    IntegrationDelete(IntegrationDelete),
45    IntegrationUpdate(Box<IntegrationUpdate>),
46    InteractionCreate(Box<InteractionCreate>),
47    InviteCreate(Box<InviteCreate>),
48    InviteDelete(InviteDelete),
49    MemberAdd(Box<MemberAdd>),
50    MemberRemove(MemberRemove),
51    MemberUpdate(Box<MemberUpdate>),
52    MemberChunk(MemberChunk),
53    MessageCreate(Box<MessageCreate>),
54    MessageDelete(MessageDelete),
55    MessageDeleteBulk(MessageDeleteBulk),
56    MessagePollVoteAdd(MessagePollVoteAdd),
57    MessagePollVoteRemove(MessagePollVoteRemove),
58    MessageUpdate(Box<MessageUpdate>),
59    PresenceUpdate(Box<PresenceUpdate>),
60    RateLimited(RateLimited),
61    ReactionAdd(Box<ReactionAdd>),
62    ReactionRemove(Box<ReactionRemove>),
63    ReactionRemoveAll(ReactionRemoveAll),
64    ReactionRemoveEmoji(ReactionRemoveEmoji),
65    Ready(Ready),
66    Resumed,
67    RoleCreate(RoleCreate),
68    RoleDelete(RoleDelete),
69    RoleUpdate(RoleUpdate),
70    StageInstanceCreate(StageInstanceCreate),
71    StageInstanceDelete(StageInstanceDelete),
72    StageInstanceUpdate(StageInstanceUpdate),
73    ThreadCreate(Box<ThreadCreate>),
74    ThreadDelete(ThreadDelete),
75    ThreadListSync(ThreadListSync),
76    ThreadMemberUpdate(Box<ThreadMemberUpdate>),
77    ThreadMembersUpdate(ThreadMembersUpdate),
78    ThreadUpdate(Box<ThreadUpdate>),
79    TypingStart(Box<TypingStart>),
80    UnavailableGuild(UnavailableGuild),
81    UserUpdate(UserUpdate),
82    VoiceServerUpdate(VoiceServerUpdate),
83    VoiceStateUpdate(Box<VoiceStateUpdate>),
84    WebhooksUpdate(WebhooksUpdate),
85}
86
87impl DispatchEvent {
88    /// Returns the type of event that this event is.
89    pub const fn kind(&self) -> EventType {
90        match self {
91            Self::AutoModerationActionExecution(_) => EventType::AutoModerationActionExecution,
92            Self::AutoModerationRuleCreate(_) => EventType::AutoModerationRuleCreate,
93            Self::AutoModerationRuleDelete(_) => EventType::AutoModerationRuleDelete,
94            Self::AutoModerationRuleUpdate(_) => EventType::AutoModerationRuleUpdate,
95            Self::BanAdd(_) => EventType::BanAdd,
96            Self::BanRemove(_) => EventType::BanRemove,
97            Self::ChannelCreate(_) => EventType::ChannelCreate,
98            Self::ChannelDelete(_) => EventType::ChannelDelete,
99            Self::ChannelPinsUpdate(_) => EventType::ChannelPinsUpdate,
100            Self::ChannelUpdate(_) => EventType::ChannelUpdate,
101            Self::CommandPermissionsUpdate(_) => EventType::CommandPermissionsUpdate,
102            Self::EntitlementCreate(_) => EventType::EntitlementCreate,
103            Self::EntitlementDelete(_) => EventType::EntitlementDelete,
104            Self::EntitlementUpdate(_) => EventType::EntitlementUpdate,
105            Self::GuildAuditLogEntryCreate(_) => EventType::GuildAuditLogEntryCreate,
106            Self::GuildCreate(_) => EventType::GuildCreate,
107            Self::GuildDelete(_) => EventType::GuildDelete,
108            Self::GuildEmojisUpdate(_) => EventType::GuildEmojisUpdate,
109            Self::GuildIntegrationsUpdate(_) => EventType::GuildIntegrationsUpdate,
110            Self::GuildScheduledEventCreate(_) => EventType::GuildScheduledEventCreate,
111            Self::GuildScheduledEventDelete(_) => EventType::GuildScheduledEventDelete,
112            Self::GuildScheduledEventUpdate(_) => EventType::GuildScheduledEventUpdate,
113            Self::GuildScheduledEventUserAdd(_) => EventType::GuildScheduledEventUserAdd,
114            Self::GuildScheduledEventUserRemove(_) => EventType::GuildScheduledEventUserRemove,
115            Self::GuildStickersUpdate(_) => EventType::GuildStickersUpdate,
116            Self::GuildUpdate(_) => EventType::GuildUpdate,
117            Self::IntegrationCreate(_) => EventType::IntegrationCreate,
118            Self::IntegrationDelete(_) => EventType::IntegrationDelete,
119            Self::IntegrationUpdate(_) => EventType::IntegrationUpdate,
120            Self::InteractionCreate(_) => EventType::InteractionCreate,
121            Self::InviteCreate(_) => EventType::InviteCreate,
122            Self::InviteDelete(_) => EventType::InviteDelete,
123            Self::MemberAdd(_) => EventType::MemberAdd,
124            Self::MemberRemove(_) => EventType::MemberRemove,
125            Self::MemberUpdate(_) => EventType::MemberUpdate,
126            Self::MemberChunk(_) => EventType::MemberChunk,
127            Self::MessageCreate(_) => EventType::MessageCreate,
128            Self::MessageDelete(_) => EventType::MessageDelete,
129            Self::MessageDeleteBulk(_) => EventType::MessageDeleteBulk,
130            Self::MessagePollVoteAdd(_) => EventType::MessagePollVoteAdd,
131            Self::MessagePollVoteRemove(_) => EventType::MessagePollVoteRemove,
132            Self::MessageUpdate(_) => EventType::MessageUpdate,
133            Self::PresenceUpdate(_) => EventType::PresenceUpdate,
134            Self::RateLimited(_) => EventType::RateLimited,
135            Self::ReactionAdd(_) => EventType::ReactionAdd,
136            Self::ReactionRemove(_) => EventType::ReactionRemove,
137            Self::ReactionRemoveAll(_) => EventType::ReactionRemoveAll,
138            Self::ReactionRemoveEmoji(_) => EventType::ReactionRemoveEmoji,
139            Self::Ready(_) => EventType::Ready,
140            Self::Resumed => EventType::Resumed,
141            Self::RoleCreate(_) => EventType::RoleCreate,
142            Self::RoleDelete(_) => EventType::RoleDelete,
143            Self::RoleUpdate(_) => EventType::RoleUpdate,
144            Self::StageInstanceCreate(_) => EventType::StageInstanceCreate,
145            Self::StageInstanceDelete(_) => EventType::StageInstanceDelete,
146            Self::StageInstanceUpdate(_) => EventType::StageInstanceUpdate,
147            Self::ThreadCreate(_) => EventType::ThreadCreate,
148            Self::ThreadDelete(_) => EventType::ThreadDelete,
149            Self::ThreadListSync(_) => EventType::ThreadListSync,
150            Self::ThreadMemberUpdate(_) => EventType::ThreadMemberUpdate,
151            Self::ThreadMembersUpdate(_) => EventType::ThreadMembersUpdate,
152            Self::ThreadUpdate(_) => EventType::ThreadUpdate,
153            Self::TypingStart(_) => EventType::TypingStart,
154            Self::UnavailableGuild(_) => EventType::UnavailableGuild,
155            Self::UserUpdate(_) => EventType::UserUpdate,
156            Self::VoiceServerUpdate(_) => EventType::VoiceServerUpdate,
157            Self::VoiceStateUpdate(_) => EventType::VoiceStateUpdate,
158            Self::WebhooksUpdate(_) => EventType::WebhooksUpdate,
159        }
160    }
161}
162
163impl TryFrom<Event> for DispatchEvent {
164    type Error = EventConversionError;
165
166    fn try_from(event: Event) -> Result<Self, Self::Error> {
167        Ok(match event {
168            Event::AutoModerationActionExecution(v) => Self::AutoModerationActionExecution(v),
169            Event::AutoModerationRuleCreate(v) => Self::AutoModerationRuleCreate(v),
170            Event::AutoModerationRuleDelete(v) => Self::AutoModerationRuleDelete(v),
171            Event::AutoModerationRuleUpdate(v) => Self::AutoModerationRuleUpdate(v),
172            Event::BanAdd(v) => Self::BanAdd(v),
173            Event::BanRemove(v) => Self::BanRemove(v),
174            Event::ChannelCreate(v) => Self::ChannelCreate(v),
175            Event::ChannelDelete(v) => Self::ChannelDelete(v),
176            Event::ChannelPinsUpdate(v) => Self::ChannelPinsUpdate(v),
177            Event::ChannelUpdate(v) => Self::ChannelUpdate(v),
178            Event::CommandPermissionsUpdate(v) => Self::CommandPermissionsUpdate(v),
179            Event::GuildAuditLogEntryCreate(v) => Self::GuildAuditLogEntryCreate(v),
180            Event::GuildCreate(v) => Self::GuildCreate(v),
181            Event::GuildDelete(v) => Self::GuildDelete(v),
182            Event::GuildEmojisUpdate(v) => Self::GuildEmojisUpdate(v),
183            Event::GuildIntegrationsUpdate(v) => Self::GuildIntegrationsUpdate(v),
184            Event::GuildScheduledEventCreate(v) => Self::GuildScheduledEventCreate(v),
185            Event::GuildScheduledEventDelete(v) => Self::GuildScheduledEventDelete(v),
186            Event::GuildScheduledEventUpdate(v) => Self::GuildScheduledEventUpdate(v),
187            Event::GuildScheduledEventUserAdd(v) => Self::GuildScheduledEventUserAdd(v),
188            Event::GuildScheduledEventUserRemove(v) => Self::GuildScheduledEventUserRemove(v),
189            Event::GuildUpdate(v) => Self::GuildUpdate(v),
190            Event::IntegrationCreate(v) => Self::IntegrationCreate(v),
191            Event::IntegrationDelete(v) => Self::IntegrationDelete(v),
192            Event::IntegrationUpdate(v) => Self::IntegrationUpdate(v),
193            Event::InteractionCreate(v) => Self::InteractionCreate(v),
194            Event::InviteCreate(v) => Self::InviteCreate(v),
195            Event::InviteDelete(v) => Self::InviteDelete(v),
196            Event::MemberAdd(v) => Self::MemberAdd(v),
197            Event::MemberRemove(v) => Self::MemberRemove(v),
198            Event::MemberUpdate(v) => Self::MemberUpdate(v),
199            Event::MemberChunk(v) => Self::MemberChunk(v),
200            Event::MessageCreate(v) => Self::MessageCreate(v),
201            Event::MessageDelete(v) => Self::MessageDelete(v),
202            Event::MessageDeleteBulk(v) => Self::MessageDeleteBulk(v),
203            Event::MessagePollVoteAdd(v) => Self::MessagePollVoteAdd(v),
204            Event::MessagePollVoteRemove(v) => Self::MessagePollVoteRemove(v),
205            Event::MessageUpdate(v) => Self::MessageUpdate(v),
206            Event::PresenceUpdate(v) => Self::PresenceUpdate(v),
207            Event::ReactionAdd(v) => Self::ReactionAdd(v),
208            Event::ReactionRemove(v) => Self::ReactionRemove(v),
209            Event::ReactionRemoveAll(v) => Self::ReactionRemoveAll(v),
210            Event::ReactionRemoveEmoji(v) => Self::ReactionRemoveEmoji(v),
211            Event::Ready(v) => Self::Ready(v),
212            Event::Resumed => Self::Resumed,
213            Event::RoleCreate(v) => Self::RoleCreate(v),
214            Event::RoleDelete(v) => Self::RoleDelete(v),
215            Event::RoleUpdate(v) => Self::RoleUpdate(v),
216            Event::StageInstanceCreate(v) => Self::StageInstanceCreate(v),
217            Event::StageInstanceDelete(v) => Self::StageInstanceDelete(v),
218            Event::StageInstanceUpdate(v) => Self::StageInstanceUpdate(v),
219            Event::ThreadCreate(v) => Self::ThreadCreate(v),
220            Event::ThreadDelete(v) => Self::ThreadDelete(v),
221            Event::ThreadListSync(v) => Self::ThreadListSync(v),
222            Event::ThreadMemberUpdate(v) => Self::ThreadMemberUpdate(v),
223            Event::ThreadMembersUpdate(v) => Self::ThreadMembersUpdate(v),
224            Event::ThreadUpdate(v) => Self::ThreadUpdate(v),
225            Event::TypingStart(v) => Self::TypingStart(v),
226            Event::UnavailableGuild(v) => Self::UnavailableGuild(v),
227            Event::UserUpdate(v) => Self::UserUpdate(v),
228            Event::VoiceServerUpdate(v) => Self::VoiceServerUpdate(v),
229            Event::VoiceStateUpdate(v) => Self::VoiceStateUpdate(v),
230            Event::WebhooksUpdate(v) => Self::WebhooksUpdate(v),
231
232            _ => return Err(EventConversionError::new(event)),
233        })
234    }
235}
236
237/// Deserialize into a [`DispatchEvent`] by knowing its event name.
238///
239/// An event name is something like `"CHANNEL_CREATE"` or `"GUILD_MEMBER_ADD"`.
240#[derive(PartialEq, Eq)]
241pub struct DispatchEventWithTypeDeserializer<'a>(&'a str);
242
243impl<'a> DispatchEventWithTypeDeserializer<'a> {
244    /// Create a new deserializer.
245    pub const fn new(event_name: &'a str) -> Self {
246        Self(event_name)
247    }
248}
249
250impl<'de> DeserializeSeed<'de> for DispatchEventWithTypeDeserializer<'_> {
251    type Value = DispatchEvent;
252
253    #[allow(clippy::too_many_lines)]
254    fn deserialize<D: Deserializer<'de>>(self, deserializer: D) -> Result<Self::Value, D::Error> {
255        Ok(match self.0 {
256            "AUTO_MODERATION_ACTION_EXECUTION" => DispatchEvent::AutoModerationActionExecution(
257                AutoModerationActionExecution::deserialize(deserializer)?,
258            ),
259            "AUTO_MODERATION_RULE_CREATE" => DispatchEvent::AutoModerationRuleCreate(
260                AutoModerationRuleCreate::deserialize(deserializer)?,
261            ),
262            "AUTO_MODERATION_RULE_DELETE" => DispatchEvent::AutoModerationRuleDelete(
263                AutoModerationRuleDelete::deserialize(deserializer)?,
264            ),
265            "AUTO_MODERATION_RULE_UPDATE" => DispatchEvent::AutoModerationRuleUpdate(
266                AutoModerationRuleUpdate::deserialize(deserializer)?,
267            ),
268            "CHANNEL_CREATE" => {
269                DispatchEvent::ChannelCreate(Box::new(ChannelCreate::deserialize(deserializer)?))
270            }
271            "CHANNEL_DELETE" => {
272                DispatchEvent::ChannelDelete(Box::new(ChannelDelete::deserialize(deserializer)?))
273            }
274            "CHANNEL_PINS_UPDATE" => {
275                DispatchEvent::ChannelPinsUpdate(ChannelPinsUpdate::deserialize(deserializer)?)
276            }
277            "CHANNEL_UPDATE" => {
278                DispatchEvent::ChannelUpdate(Box::new(ChannelUpdate::deserialize(deserializer)?))
279            }
280            "APPLICATION_COMMAND_PERMISSIONS_UPDATE" => DispatchEvent::CommandPermissionsUpdate(
281                CommandPermissionsUpdate::deserialize(deserializer)?,
282            ),
283            "ENTITLEMENT_CREATE" => {
284                DispatchEvent::EntitlementCreate(EntitlementCreate::deserialize(deserializer)?)
285            }
286            "GUILD_AUDIT_LOG_ENTRY_CREATE" => DispatchEvent::GuildAuditLogEntryCreate(Box::new(
287                GuildAuditLogEntryCreate::deserialize(deserializer)?,
288            )),
289            "GUILD_BAN_ADD" => DispatchEvent::BanAdd(BanAdd::deserialize(deserializer)?),
290            "GUILD_BAN_REMOVE" => DispatchEvent::BanRemove(BanRemove::deserialize(deserializer)?),
291            "GUILD_CREATE" => {
292                DispatchEvent::GuildCreate(Box::new(GuildCreate::deserialize(deserializer)?))
293            }
294            "GUILD_DELETE" => DispatchEvent::GuildDelete(GuildDelete::deserialize(deserializer)?),
295            "GUILD_EMOJIS_UPDATE" => {
296                DispatchEvent::GuildEmojisUpdate(GuildEmojisUpdate::deserialize(deserializer)?)
297            }
298            "GUILD_INTEGRATIONS_UPDATE" => DispatchEvent::GuildIntegrationsUpdate(
299                GuildIntegrationsUpdate::deserialize(deserializer)?,
300            ),
301            "GUILD_SCHEDULED_EVENT_CREATE" => DispatchEvent::GuildScheduledEventCreate(Box::new(
302                GuildScheduledEventCreate::deserialize(deserializer)?,
303            )),
304            "GUILD_SCHEDULED_EVENT_DELETE" => DispatchEvent::GuildScheduledEventDelete(Box::new(
305                GuildScheduledEventDelete::deserialize(deserializer)?,
306            )),
307            "GUILD_SCHEDULED_EVENT_UPDATE" => DispatchEvent::GuildScheduledEventUpdate(Box::new(
308                GuildScheduledEventUpdate::deserialize(deserializer)?,
309            )),
310            "GUILD_SCHEDULED_EVENT_USER_ADD" => DispatchEvent::GuildScheduledEventUserAdd(
311                GuildScheduledEventUserAdd::deserialize(deserializer)?,
312            ),
313            "GUILD_SCHEDULED_EVENT_USER_REMOVE" => DispatchEvent::GuildScheduledEventUserRemove(
314                GuildScheduledEventUserRemove::deserialize(deserializer)?,
315            ),
316            "GUILD_MEMBERS_CHUNK" => {
317                DispatchEvent::MemberChunk(MemberChunk::deserialize(deserializer)?)
318            }
319            "GUILD_MEMBER_ADD" => {
320                DispatchEvent::MemberAdd(Box::new(MemberAdd::deserialize(deserializer)?))
321            }
322            "GUILD_MEMBER_REMOVE" => {
323                DispatchEvent::MemberRemove(MemberRemove::deserialize(deserializer)?)
324            }
325            "GUILD_MEMBER_UPDATE" => {
326                DispatchEvent::MemberUpdate(Box::new(MemberUpdate::deserialize(deserializer)?))
327            }
328            "GUILD_ROLE_CREATE" => {
329                DispatchEvent::RoleCreate(RoleCreate::deserialize(deserializer)?)
330            }
331            "GUILD_ROLE_DELETE" => {
332                DispatchEvent::RoleDelete(RoleDelete::deserialize(deserializer)?)
333            }
334            "GUILD_ROLE_UPDATE" => {
335                DispatchEvent::RoleUpdate(RoleUpdate::deserialize(deserializer)?)
336            }
337            "GUILD_STICKERS_UPDATE" => {
338                DispatchEvent::GuildStickersUpdate(GuildStickersUpdate::deserialize(deserializer)?)
339            }
340            "GUILD_UPDATE" => {
341                DispatchEvent::GuildUpdate(Box::new(GuildUpdate::deserialize(deserializer)?))
342            }
343            "INTEGRATION_CREATE" => DispatchEvent::IntegrationCreate(Box::new(
344                IntegrationCreate::deserialize(deserializer)?,
345            )),
346            "INTEGRATION_DELETE" => {
347                DispatchEvent::IntegrationDelete(IntegrationDelete::deserialize(deserializer)?)
348            }
349            "INTEGRATION_UPDATE" => DispatchEvent::IntegrationUpdate(Box::new(
350                IntegrationUpdate::deserialize(deserializer)?,
351            )),
352            "INTERACTION_CREATE" => DispatchEvent::InteractionCreate(Box::new(
353                InteractionCreate::deserialize(deserializer)?,
354            )),
355            "INVITE_CREATE" => {
356                DispatchEvent::InviteCreate(Box::new(InviteCreate::deserialize(deserializer)?))
357            }
358            "INVITE_DELETE" => {
359                DispatchEvent::InviteDelete(InviteDelete::deserialize(deserializer)?)
360            }
361            "MESSAGE_CREATE" => {
362                DispatchEvent::MessageCreate(Box::new(MessageCreate::deserialize(deserializer)?))
363            }
364            "MESSAGE_DELETE" => {
365                DispatchEvent::MessageDelete(MessageDelete::deserialize(deserializer)?)
366            }
367            "MESSAGE_DELETE_BULK" => {
368                DispatchEvent::MessageDeleteBulk(MessageDeleteBulk::deserialize(deserializer)?)
369            }
370            "MESSAGE_REACTION_ADD" => {
371                DispatchEvent::ReactionAdd(Box::new(ReactionAdd::deserialize(deserializer)?))
372            }
373            "MESSAGE_REACTION_REMOVE" => {
374                DispatchEvent::ReactionRemove(Box::new(ReactionRemove::deserialize(deserializer)?))
375            }
376            "MESSAGE_REACTION_REMOVE_EMOJI" => {
377                DispatchEvent::ReactionRemoveEmoji(ReactionRemoveEmoji::deserialize(deserializer)?)
378            }
379            "MESSAGE_REACTION_REMOVE_ALL" => {
380                DispatchEvent::ReactionRemoveAll(ReactionRemoveAll::deserialize(deserializer)?)
381            }
382            "MESSAGE_POLL_VOTE_ADD" => {
383                DispatchEvent::MessagePollVoteAdd(MessagePollVoteAdd::deserialize(deserializer)?)
384            }
385            "MESSAGE_POLL_VOTE_REMOVE" => DispatchEvent::MessagePollVoteRemove(
386                MessagePollVoteRemove::deserialize(deserializer)?,
387            ),
388            "MESSAGE_UPDATE" => {
389                DispatchEvent::MessageUpdate(Box::new(MessageUpdate::deserialize(deserializer)?))
390            }
391            "PRESENCE_UPDATE" => {
392                DispatchEvent::PresenceUpdate(Box::new(PresenceUpdate::deserialize(deserializer)?))
393            }
394            "RATE_LIMITED" => DispatchEvent::RateLimited(RateLimited::deserialize(deserializer)?),
395            "READY" => DispatchEvent::Ready(Ready::deserialize(deserializer)?),
396            "RESUMED" => {
397                deserializer.deserialize_ignored_any(IgnoredAny)?;
398
399                DispatchEvent::Resumed
400            }
401            "STAGE_INSTANCE_CREATE" => {
402                DispatchEvent::StageInstanceCreate(StageInstanceCreate::deserialize(deserializer)?)
403            }
404            "STAGE_INSTANCE_DELETE" => {
405                DispatchEvent::StageInstanceDelete(StageInstanceDelete::deserialize(deserializer)?)
406            }
407            "STAGE_INSTANCE_UPDATE" => {
408                DispatchEvent::StageInstanceUpdate(StageInstanceUpdate::deserialize(deserializer)?)
409            }
410            "THREAD_CREATE" => {
411                DispatchEvent::ThreadCreate(Box::new(ThreadCreate::deserialize(deserializer)?))
412            }
413            "THREAD_DELETE" => {
414                DispatchEvent::ThreadDelete(ThreadDelete::deserialize(deserializer)?)
415            }
416            "THREAD_LIST_SYNC" => {
417                DispatchEvent::ThreadListSync(ThreadListSync::deserialize(deserializer)?)
418            }
419            "THREAD_MEMBER_UPDATE" => DispatchEvent::ThreadMemberUpdate(Box::new(
420                ThreadMemberUpdate::deserialize(deserializer)?,
421            )),
422            "THREAD_MEMBERS_UPDATE" => {
423                DispatchEvent::ThreadMembersUpdate(ThreadMembersUpdate::deserialize(deserializer)?)
424            }
425            "THREAD_UPDATE" => {
426                DispatchEvent::ThreadUpdate(Box::new(ThreadUpdate::deserialize(deserializer)?))
427            }
428            "TYPING_START" => {
429                DispatchEvent::TypingStart(Box::new(TypingStart::deserialize(deserializer)?))
430            }
431            "USER_UPDATE" => DispatchEvent::UserUpdate(UserUpdate::deserialize(deserializer)?),
432            "VOICE_SERVER_UPDATE" => {
433                DispatchEvent::VoiceServerUpdate(VoiceServerUpdate::deserialize(deserializer)?)
434            }
435            "VOICE_STATE_UPDATE" => DispatchEvent::VoiceStateUpdate(Box::new(
436                VoiceStateUpdate::deserialize(deserializer)?,
437            )),
438            "WEBHOOKS_UPDATE" => {
439                DispatchEvent::WebhooksUpdate(WebhooksUpdate::deserialize(deserializer)?)
440            }
441            other => return Err(DeError::unknown_variant(other, &[])),
442        })
443    }
444}