Skip to main content

twilight_model/gateway/event/
mod.rs

1#![allow(clippy::wildcard_imports)]
2
3pub mod gateway;
4
5mod dispatch;
6mod kind;
7
8pub use self::{
9    dispatch::{DispatchEvent, DispatchEventWithTypeDeserializer},
10    gateway::{GatewayEvent, GatewayEventDeserializer},
11    kind::EventType,
12};
13
14use super::{CloseFrame, payload::incoming::*};
15use crate::gateway::payload::incoming::rate_limited::RateLimitMetadata;
16use crate::id::{Id, marker::GuildMarker};
17use std::error::Error;
18use std::fmt::{Debug, Display, Formatter, Result as FmtResult};
19
20/// Any type of event that a shard emits.
21///
22/// Flattened type containing all the variants of [`DispatchEvent`] and
23/// [`GatewayEvent`], along with a [gateway close event].
24///
25/// [gateway close event]: Self::GatewayClose
26#[derive(Clone, Debug, PartialEq)]
27pub enum Event {
28    /// Message was blocked by AutoMod according to a rule.
29    AutoModerationActionExecution(AutoModerationActionExecution),
30    /// Sent when an auto moderation rule is created.
31    AutoModerationRuleCreate(AutoModerationRuleCreate),
32    /// Sent when an auto moderation rule is deleted.
33    AutoModerationRuleDelete(AutoModerationRuleDelete),
34    /// Sent when an auto moderation rule is updated.
35    AutoModerationRuleUpdate(AutoModerationRuleUpdate),
36    /// A user was banned from a guild.
37    BanAdd(BanAdd),
38    /// A user's ban from a guild was removed.
39    BanRemove(BanRemove),
40    /// A channel was created.
41    ChannelCreate(Box<ChannelCreate>),
42    /// A channel was deleted.
43    ChannelDelete(Box<ChannelDelete>),
44    /// A channel's pins were updated.
45    ChannelPinsUpdate(ChannelPinsUpdate),
46    /// A channel was updated.
47    ChannelUpdate(Box<ChannelUpdate>),
48    /// A command's permissions were updated.
49    CommandPermissionsUpdate(CommandPermissionsUpdate),
50    /// A user subscribes to a SKU.
51    EntitlementCreate(EntitlementCreate),
52    /// A user's entitlement is removed.
53    EntitlementDelete(EntitlementDelete),
54    /// A user's subscription renews for the
55    /// next billing period.
56    ///
57    /// The `ends_at` field will have an updated value with
58    /// the new expiration date.
59    EntitlementUpdate(EntitlementUpdate),
60    /// Close message with an optional frame including information about the
61    /// reason for the close.
62    GatewayClose(Option<CloseFrame<'static>>),
63    /// A heartbeat was received from the gateway.
64    GatewayHeartbeat,
65    /// A heartbeat acknowledgement was received from the gateway.
66    GatewayHeartbeatAck,
67    /// A "hello" packet was received from the gateway.
68    GatewayHello(Hello),
69    /// A shard's session was invalidated.
70    ///
71    /// `true` if resumable. If not, then the shard must do a full reconnect.
72    GatewayInvalidateSession(bool),
73    /// The gateway is indicating to perform a reconnect.
74    GatewayReconnect,
75    /// A audit log entry was created.
76    GuildAuditLogEntryCreate(Box<GuildAuditLogEntryCreate>),
77    /// A guild was created.
78    GuildCreate(Box<GuildCreate>),
79    /// A guild was deleted or the current user was removed from a guild.
80    GuildDelete(GuildDelete),
81    /// A guild's emojis were updated.
82    GuildEmojisUpdate(GuildEmojisUpdate),
83    /// A guild's integrations were updated.
84    GuildIntegrationsUpdate(GuildIntegrationsUpdate),
85    /// A guild scheduled event was created.
86    GuildScheduledEventCreate(Box<GuildScheduledEventCreate>),
87    /// A guild scheduled event was deleted.
88    GuildScheduledEventDelete(Box<GuildScheduledEventDelete>),
89    /// A guild scheduled event was updated.
90    GuildScheduledEventUpdate(Box<GuildScheduledEventUpdate>),
91    /// A user was added to a guild scheduled event.
92    GuildScheduledEventUserAdd(GuildScheduledEventUserAdd),
93    /// A user was removed from a guild scheduled event.
94    GuildScheduledEventUserRemove(GuildScheduledEventUserRemove),
95    /// A guild's stickers were updated.
96    GuildStickersUpdate(GuildStickersUpdate),
97    /// A guild was updated.
98    GuildUpdate(Box<GuildUpdate>),
99    /// A guild integration was created.
100    IntegrationCreate(Box<IntegrationCreate>),
101    /// A guild integration was deleted.
102    IntegrationDelete(IntegrationDelete),
103    /// A guild integration was updated.
104    IntegrationUpdate(Box<IntegrationUpdate>),
105    /// An interaction was invoked by a user.
106    InteractionCreate(Box<InteractionCreate>),
107    /// A invite was made.
108    InviteCreate(Box<InviteCreate>),
109    /// A invite was deleted.
110    InviteDelete(InviteDelete),
111    /// A user was added to a guild.
112    MemberAdd(Box<MemberAdd>),
113    /// A user was removed from a guild.
114    MemberRemove(MemberRemove),
115    /// A user's member object in a guild was updated.
116    MemberUpdate(Box<MemberUpdate>),
117    /// A chunk of members were received from the gateway.
118    MemberChunk(MemberChunk),
119    /// A message was created in a channel.
120    MessageCreate(Box<MessageCreate>),
121    /// A message was deleted in a channel.
122    MessageDelete(MessageDelete),
123    /// Multiple messages were deleted in a channel.
124    MessageDeleteBulk(MessageDeleteBulk),
125    /// A vote was added to a poll.
126    MessagePollVoteAdd(MessagePollVoteAdd),
127    /// A vote was removed from a poll.
128    MessagePollVoteRemove(MessagePollVoteRemove),
129    /// A message was updated in a channel.
130    MessageUpdate(Box<MessageUpdate>),
131    /// A user's active presence (such as game or online status) was updated.
132    PresenceUpdate(Box<PresenceUpdate>),
133    /// A shard was rate limited for a gateway opcode.
134    RateLimited(RateLimited),
135    /// A reaction was added to a message.
136    ReactionAdd(Box<ReactionAdd>),
137    /// A reaction was removed from a message.
138    ReactionRemove(Box<ReactionRemove>),
139    /// All reactions were removed from a message.
140    ReactionRemoveAll(ReactionRemoveAll),
141    /// All instances of a given emoji from the reactions of a message were
142    /// removed.
143    ReactionRemoveEmoji(ReactionRemoveEmoji),
144    /// A shard is now "ready" and fully connected.
145    Ready(Ready),
146    /// A shard has successfully resumed.
147    Resumed,
148    /// A role was created in a guild.
149    RoleCreate(RoleCreate),
150    /// A role was deleted in a guild.
151    RoleDelete(RoleDelete),
152    /// A role was updated in a guild.
153    RoleUpdate(RoleUpdate),
154    /// A stage instance was created in a stage channel.
155    StageInstanceCreate(StageInstanceCreate),
156    /// A stage instance was deleted in a stage channel.
157    StageInstanceDelete(StageInstanceDelete),
158    /// A stage instance was updated in a stage channel.
159    StageInstanceUpdate(StageInstanceUpdate),
160    /// A Subscription for a Premium App has been created.
161    SubscriptionCreate(SubscriptionCreate),
162    /// A Subscription for a Premium App has been deleted.
163    SubscriptionDelete(SubscriptionDelete),
164    /// A Subscription for a Premium App has been updated.
165    SubscriptionUpdate(SubscriptionUpdate),
166    /// A thread has been created, relevant to the current user,
167    /// or the current user has been added to a thread.
168    ThreadCreate(Box<ThreadCreate>),
169    /// A thread, relevant to the current user, has been deleted.
170    ThreadDelete(ThreadDelete),
171    /// The current user has gained access to a thread.
172    ThreadListSync(ThreadListSync),
173    /// The thread member object for the current user has been updated.
174    ThreadMemberUpdate(Box<ThreadMemberUpdate>),
175    /// A user has been added to or removed from a thread.
176    ThreadMembersUpdate(ThreadMembersUpdate),
177    /// A thread has been updated.
178    ThreadUpdate(Box<ThreadUpdate>),
179    /// A user started typing in a channel.
180    TypingStart(Box<TypingStart>),
181    /// A guild is now unavailable.
182    UnavailableGuild(UnavailableGuild),
183    /// The current user was updated.
184    UserUpdate(UserUpdate),
185    /// A voice server update was sent.
186    VoiceServerUpdate(VoiceServerUpdate),
187    /// A voice state in a voice channel was updated.
188    VoiceStateUpdate(Box<VoiceStateUpdate>),
189    /// A webhook was updated.
190    WebhooksUpdate(WebhooksUpdate),
191}
192
193impl Event {
194    /// Guild ID of the event, if available.
195    pub const fn guild_id(&self) -> Option<Id<GuildMarker>> {
196        match self {
197            Event::AutoModerationActionExecution(e) => Some(e.guild_id),
198            Event::AutoModerationRuleCreate(e) => Some(e.0.guild_id),
199            Event::AutoModerationRuleDelete(e) => Some(e.0.guild_id),
200            Event::AutoModerationRuleUpdate(e) => Some(e.0.guild_id),
201            Event::BanAdd(e) => Some(e.guild_id),
202            Event::BanRemove(e) => Some(e.guild_id),
203            Event::ChannelCreate(e) => e.0.guild_id,
204            Event::ChannelDelete(e) => e.0.guild_id,
205            Event::ChannelPinsUpdate(e) => e.guild_id,
206            Event::ChannelUpdate(e) => e.0.guild_id,
207            Event::CommandPermissionsUpdate(e) => Some(e.0.guild_id),
208            Event::GuildAuditLogEntryCreate(e) => e.0.guild_id,
209            Event::GuildCreate(e) => Some(e.id()),
210            Event::GuildDelete(e) => Some(e.id),
211            Event::GuildEmojisUpdate(e) => Some(e.guild_id),
212            Event::GuildIntegrationsUpdate(e) => Some(e.guild_id),
213            Event::GuildScheduledEventCreate(e) => Some(e.0.guild_id),
214            Event::GuildScheduledEventDelete(e) => Some(e.0.guild_id),
215            Event::GuildScheduledEventUpdate(e) => Some(e.0.guild_id),
216            Event::GuildScheduledEventUserAdd(e) => Some(e.guild_id),
217            Event::GuildScheduledEventUserRemove(e) => Some(e.guild_id),
218            Event::GuildStickersUpdate(e) => Some(e.guild_id),
219            Event::GuildUpdate(e) => Some(e.0.id),
220            Event::IntegrationCreate(e) => e.0.guild_id,
221            Event::IntegrationDelete(e) => Some(e.guild_id),
222            Event::IntegrationUpdate(e) => e.0.guild_id,
223            Event::InteractionCreate(e) => e.0.guild_id,
224            Event::InviteCreate(e) => Some(e.guild_id),
225            Event::InviteDelete(e) => Some(e.guild_id),
226            Event::MemberAdd(e) => Some(e.guild_id),
227            Event::MemberChunk(e) => Some(e.guild_id),
228            Event::MemberRemove(e) => Some(e.guild_id),
229            Event::MemberUpdate(e) => Some(e.guild_id),
230            Event::MessageCreate(e) => e.message.guild_id,
231            Event::MessageDelete(e) => e.guild_id,
232            Event::MessageDeleteBulk(e) => e.guild_id,
233            Event::MessageUpdate(e) => e.0.guild_id,
234            Event::MessagePollVoteAdd(e) => e.guild_id,
235            Event::MessagePollVoteRemove(e) => e.guild_id,
236            Event::PresenceUpdate(e) => Some(e.0.guild_id),
237            Event::RateLimited(RateLimited {
238                meta: RateLimitMetadata::RequestGuildMembers { guild_id, .. },
239                ..
240            }) => Some(*guild_id),
241            Event::ReactionAdd(e) => e.0.guild_id,
242            Event::ReactionRemove(e) => e.0.guild_id,
243            Event::ReactionRemoveAll(e) => e.guild_id,
244            Event::ReactionRemoveEmoji(e) => Some(e.guild_id),
245            Event::RoleCreate(e) => Some(e.guild_id),
246            Event::RoleDelete(e) => Some(e.guild_id),
247            Event::RoleUpdate(e) => Some(e.guild_id),
248            Event::StageInstanceCreate(e) => Some(e.0.guild_id),
249            Event::StageInstanceDelete(e) => Some(e.0.guild_id),
250            Event::StageInstanceUpdate(e) => Some(e.0.guild_id),
251            Event::ThreadCreate(e) => e.0.guild_id,
252            Event::ThreadDelete(e) => Some(e.guild_id),
253            Event::ThreadListSync(e) => Some(e.guild_id),
254            Event::ThreadMemberUpdate(e) => Some(e.guild_id),
255            Event::ThreadMembersUpdate(e) => Some(e.guild_id),
256            Event::ThreadUpdate(e) => e.0.guild_id,
257            Event::TypingStart(e) => e.guild_id,
258            Event::UnavailableGuild(e) => Some(e.id),
259            Event::VoiceServerUpdate(e) => Some(e.guild_id),
260            Event::VoiceStateUpdate(e) => e.0.guild_id,
261            Event::WebhooksUpdate(e) => Some(e.guild_id),
262            Event::GatewayClose(_)
263            | Event::EntitlementCreate(_)
264            | Event::EntitlementDelete(_)
265            | Event::EntitlementUpdate(_)
266            | Event::GatewayHeartbeat
267            | Event::GatewayHeartbeatAck
268            | Event::GatewayHello(_)
269            | Event::GatewayInvalidateSession(_)
270            | Event::GatewayReconnect
271            | Event::Ready(_)
272            | Event::Resumed
273            | Event::SubscriptionCreate(_)
274            | Event::SubscriptionDelete(_)
275            | Event::SubscriptionUpdate(_)
276            | Event::UserUpdate(_) => None,
277        }
278    }
279
280    pub const fn kind(&self) -> EventType {
281        match self {
282            Self::AutoModerationActionExecution(_) => EventType::AutoModerationActionExecution,
283            Self::AutoModerationRuleCreate(_) => EventType::AutoModerationRuleCreate,
284            Self::AutoModerationRuleDelete(_) => EventType::AutoModerationRuleDelete,
285            Self::AutoModerationRuleUpdate(_) => EventType::AutoModerationRuleUpdate,
286            Self::BanAdd(_) => EventType::BanAdd,
287            Self::BanRemove(_) => EventType::BanRemove,
288            Self::ChannelCreate(_) => EventType::ChannelCreate,
289            Self::ChannelDelete(_) => EventType::ChannelDelete,
290            Self::ChannelPinsUpdate(_) => EventType::ChannelPinsUpdate,
291            Self::ChannelUpdate(_) => EventType::ChannelUpdate,
292            Self::CommandPermissionsUpdate(_) => EventType::CommandPermissionsUpdate,
293            Self::EntitlementCreate(_) => EventType::EntitlementCreate,
294            Self::EntitlementDelete(_) => EventType::EntitlementDelete,
295            Self::EntitlementUpdate(_) => EventType::EntitlementUpdate,
296            Self::GatewayClose(_) => EventType::GatewayClose,
297            Self::GatewayHeartbeat => EventType::GatewayHeartbeat,
298            Self::GatewayHeartbeatAck => EventType::GatewayHeartbeatAck,
299            Self::GatewayHello(_) => EventType::GatewayHello,
300            Self::GatewayInvalidateSession(_) => EventType::GatewayInvalidateSession,
301            Self::GatewayReconnect => EventType::GatewayReconnect,
302            Self::GuildAuditLogEntryCreate(_) => EventType::GuildAuditLogEntryCreate,
303            Self::GuildCreate(_) => EventType::GuildCreate,
304            Self::GuildDelete(_) => EventType::GuildDelete,
305            Self::GuildEmojisUpdate(_) => EventType::GuildEmojisUpdate,
306            Self::GuildIntegrationsUpdate(_) => EventType::GuildIntegrationsUpdate,
307            Self::GuildScheduledEventCreate(_) => EventType::GuildScheduledEventCreate,
308            Self::GuildScheduledEventDelete(_) => EventType::GuildScheduledEventDelete,
309            Self::GuildScheduledEventUpdate(_) => EventType::GuildScheduledEventUpdate,
310            Self::GuildScheduledEventUserAdd(_) => EventType::GuildScheduledEventUserAdd,
311            Self::GuildScheduledEventUserRemove(_) => EventType::GuildScheduledEventUserRemove,
312            Self::GuildStickersUpdate(_) => EventType::GuildStickersUpdate,
313            Self::GuildUpdate(_) => EventType::GuildUpdate,
314            Self::IntegrationCreate(_) => EventType::IntegrationCreate,
315            Self::IntegrationDelete(_) => EventType::IntegrationDelete,
316            Self::IntegrationUpdate(_) => EventType::IntegrationUpdate,
317            Self::InteractionCreate(_) => EventType::InteractionCreate,
318            Self::InviteCreate(_) => EventType::InviteCreate,
319            Self::InviteDelete(_) => EventType::InviteDelete,
320            Self::MemberAdd(_) => EventType::MemberAdd,
321            Self::MemberRemove(_) => EventType::MemberRemove,
322            Self::MemberUpdate(_) => EventType::MemberUpdate,
323            Self::MemberChunk(_) => EventType::MemberChunk,
324            Self::MessageCreate(_) => EventType::MessageCreate,
325            Self::MessageDelete(_) => EventType::MessageDelete,
326            Self::MessageDeleteBulk(_) => EventType::MessageDeleteBulk,
327            Self::MessagePollVoteAdd(_) => EventType::MessagePollVoteAdd,
328            Self::MessagePollVoteRemove(_) => EventType::MessagePollVoteRemove,
329            Self::MessageUpdate(_) => EventType::MessageUpdate,
330            Self::PresenceUpdate(_) => EventType::PresenceUpdate,
331            Self::RateLimited(_) => EventType::RateLimited,
332            Self::ReactionAdd(_) => EventType::ReactionAdd,
333            Self::ReactionRemove(_) => EventType::ReactionRemove,
334            Self::ReactionRemoveAll(_) => EventType::ReactionRemoveAll,
335            Self::ReactionRemoveEmoji(_) => EventType::ReactionRemoveEmoji,
336            Self::Ready(_) => EventType::Ready,
337            Self::Resumed => EventType::Resumed,
338            Self::RoleCreate(_) => EventType::RoleCreate,
339            Self::RoleDelete(_) => EventType::RoleDelete,
340            Self::RoleUpdate(_) => EventType::RoleUpdate,
341            Self::StageInstanceCreate(_) => EventType::StageInstanceCreate,
342            Self::StageInstanceDelete(_) => EventType::StageInstanceDelete,
343            Self::StageInstanceUpdate(_) => EventType::StageInstanceUpdate,
344            Self::SubscriptionCreate(_) => EventType::SubscriptionCreate,
345            Self::SubscriptionDelete(_) => EventType::SubscriptionDelete,
346            Self::SubscriptionUpdate(_) => EventType::SubscriptionUpdate,
347            Self::ThreadCreate(_) => EventType::ThreadCreate,
348            Self::ThreadDelete(_) => EventType::ThreadDelete,
349            Self::ThreadListSync(_) => EventType::ThreadListSync,
350            Self::ThreadMemberUpdate(_) => EventType::ThreadMemberUpdate,
351            Self::ThreadMembersUpdate(_) => EventType::ThreadMembersUpdate,
352            Self::ThreadUpdate(_) => EventType::ThreadUpdate,
353            Self::TypingStart(_) => EventType::TypingStart,
354            Self::UnavailableGuild(_) => EventType::UnavailableGuild,
355            Self::UserUpdate(_) => EventType::UserUpdate,
356            Self::VoiceServerUpdate(_) => EventType::VoiceServerUpdate,
357            Self::VoiceStateUpdate(_) => EventType::VoiceStateUpdate,
358            Self::WebhooksUpdate(_) => EventType::WebhooksUpdate,
359        }
360    }
361}
362
363impl From<DispatchEvent> for Event {
364    fn from(event: DispatchEvent) -> Self {
365        match event {
366            DispatchEvent::AutoModerationActionExecution(v) => {
367                Self::AutoModerationActionExecution(v)
368            }
369            DispatchEvent::AutoModerationRuleCreate(v) => Self::AutoModerationRuleCreate(v),
370            DispatchEvent::AutoModerationRuleDelete(v) => Self::AutoModerationRuleDelete(v),
371            DispatchEvent::AutoModerationRuleUpdate(v) => Self::AutoModerationRuleUpdate(v),
372            DispatchEvent::BanAdd(v) => Self::BanAdd(v),
373            DispatchEvent::BanRemove(v) => Self::BanRemove(v),
374            DispatchEvent::ChannelCreate(v) => Self::ChannelCreate(v),
375            DispatchEvent::ChannelDelete(v) => Self::ChannelDelete(v),
376            DispatchEvent::ChannelPinsUpdate(v) => Self::ChannelPinsUpdate(v),
377            DispatchEvent::ChannelUpdate(v) => Self::ChannelUpdate(v),
378            DispatchEvent::CommandPermissionsUpdate(v) => Self::CommandPermissionsUpdate(v),
379            DispatchEvent::EntitlementCreate(v) => Self::EntitlementCreate(v),
380            DispatchEvent::EntitlementDelete(v) => Self::EntitlementDelete(v),
381            DispatchEvent::EntitlementUpdate(v) => Self::EntitlementUpdate(v),
382            DispatchEvent::GuildAuditLogEntryCreate(v) => Self::GuildAuditLogEntryCreate(v),
383            DispatchEvent::GuildCreate(v) => Self::GuildCreate(v),
384            DispatchEvent::GuildDelete(v) => Self::GuildDelete(v),
385            DispatchEvent::GuildEmojisUpdate(v) => Self::GuildEmojisUpdate(v),
386            DispatchEvent::GuildIntegrationsUpdate(v) => Self::GuildIntegrationsUpdate(v),
387            DispatchEvent::GuildScheduledEventCreate(v) => Self::GuildScheduledEventCreate(v),
388            DispatchEvent::GuildScheduledEventDelete(v) => Self::GuildScheduledEventDelete(v),
389            DispatchEvent::GuildScheduledEventUpdate(v) => Self::GuildScheduledEventUpdate(v),
390            DispatchEvent::GuildScheduledEventUserAdd(v) => Self::GuildScheduledEventUserAdd(v),
391            DispatchEvent::GuildScheduledEventUserRemove(v) => {
392                Self::GuildScheduledEventUserRemove(v)
393            }
394            DispatchEvent::GuildStickersUpdate(v) => Self::GuildStickersUpdate(v),
395            DispatchEvent::GuildUpdate(v) => Self::GuildUpdate(v),
396            DispatchEvent::IntegrationCreate(v) => Self::IntegrationCreate(v),
397            DispatchEvent::IntegrationDelete(v) => Self::IntegrationDelete(v),
398            DispatchEvent::IntegrationUpdate(v) => Self::IntegrationUpdate(v),
399            DispatchEvent::InteractionCreate(v) => Self::InteractionCreate(v),
400            DispatchEvent::InviteCreate(v) => Self::InviteCreate(v),
401            DispatchEvent::InviteDelete(v) => Self::InviteDelete(v),
402            DispatchEvent::MemberAdd(v) => Self::MemberAdd(v),
403            DispatchEvent::MemberRemove(v) => Self::MemberRemove(v),
404            DispatchEvent::MemberUpdate(v) => Self::MemberUpdate(v),
405            DispatchEvent::MemberChunk(v) => Self::MemberChunk(v),
406            DispatchEvent::RoleCreate(v) => Self::RoleCreate(v),
407            DispatchEvent::RoleDelete(v) => Self::RoleDelete(v),
408            DispatchEvent::RoleUpdate(v) => Self::RoleUpdate(v),
409            DispatchEvent::MessageCreate(v) => Self::MessageCreate(v),
410            DispatchEvent::MessageDelete(v) => Self::MessageDelete(v),
411            DispatchEvent::MessageDeleteBulk(v) => Self::MessageDeleteBulk(v),
412            DispatchEvent::MessagePollVoteAdd(v) => Self::MessagePollVoteAdd(v),
413            DispatchEvent::MessagePollVoteRemove(v) => Self::MessagePollVoteRemove(v),
414            DispatchEvent::MessageUpdate(v) => Self::MessageUpdate(v),
415            DispatchEvent::PresenceUpdate(v) => Self::PresenceUpdate(v),
416            DispatchEvent::RateLimited(v) => Self::RateLimited(v),
417            DispatchEvent::ReactionAdd(v) => Self::ReactionAdd(v),
418            DispatchEvent::ReactionRemove(v) => Self::ReactionRemove(v),
419            DispatchEvent::ReactionRemoveAll(v) => Self::ReactionRemoveAll(v),
420            DispatchEvent::ReactionRemoveEmoji(v) => Self::ReactionRemoveEmoji(v),
421            DispatchEvent::Ready(v) => Self::Ready(v),
422            DispatchEvent::Resumed => Self::Resumed,
423            DispatchEvent::StageInstanceCreate(v) => Self::StageInstanceCreate(v),
424            DispatchEvent::StageInstanceDelete(v) => Self::StageInstanceDelete(v),
425            DispatchEvent::StageInstanceUpdate(v) => Self::StageInstanceUpdate(v),
426            DispatchEvent::SubscriptionCreate(v) => Self::SubscriptionCreate(v),
427            DispatchEvent::SubscriptionDelete(v) => Self::SubscriptionDelete(v),
428            DispatchEvent::SubscriptionUpdate(v) => Self::SubscriptionUpdate(v),
429            DispatchEvent::ThreadCreate(v) => Self::ThreadCreate(v),
430            DispatchEvent::ThreadDelete(v) => Self::ThreadDelete(v),
431            DispatchEvent::ThreadListSync(v) => Self::ThreadListSync(v),
432            DispatchEvent::ThreadMemberUpdate(v) => Self::ThreadMemberUpdate(v),
433            DispatchEvent::ThreadMembersUpdate(v) => Self::ThreadMembersUpdate(v),
434            DispatchEvent::ThreadUpdate(v) => Self::ThreadUpdate(v),
435            DispatchEvent::TypingStart(v) => Self::TypingStart(v),
436            DispatchEvent::UnavailableGuild(v) => Self::UnavailableGuild(v),
437            DispatchEvent::UserUpdate(v) => Self::UserUpdate(v),
438            DispatchEvent::VoiceServerUpdate(v) => Self::VoiceServerUpdate(v),
439            DispatchEvent::VoiceStateUpdate(v) => Self::VoiceStateUpdate(v),
440            DispatchEvent::WebhooksUpdate(v) => Self::WebhooksUpdate(v),
441        }
442    }
443}
444
445impl From<GatewayEvent> for Event {
446    fn from(event: GatewayEvent) -> Self {
447        match event {
448            GatewayEvent::Dispatch(_, e) => Self::from(e),
449            GatewayEvent::Heartbeat => Self::GatewayHeartbeat,
450            GatewayEvent::HeartbeatAck => Self::GatewayHeartbeatAck,
451            GatewayEvent::Hello(interval) => Self::GatewayHello(interval),
452            GatewayEvent::InvalidateSession(r) => Self::GatewayInvalidateSession(r),
453            GatewayEvent::Reconnect => Self::GatewayReconnect,
454        }
455    }
456}
457
458/// An error that describes a failure to convert from one event type to another.
459#[derive(Debug)]
460pub struct EventConversionError {
461    event: Event,
462}
463
464impl EventConversionError {
465    pub const fn new(event: Event) -> EventConversionError {
466        Self { event }
467    }
468
469    /// Return an immutable reference to the original event.
470    pub const fn event_ref(&self) -> &Event {
471        &self.event
472    }
473
474    /// Consume the error, returning the original event.
475    #[allow(clippy::missing_const_for_fn)]
476    pub fn into_event(self) -> Event {
477        self.event
478    }
479}
480
481impl Display for EventConversionError {
482    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
483        f.write_str("event variant failed to convert")
484    }
485}
486
487impl Error for EventConversionError {}
488
489#[cfg(test)]
490mod tests {
491    //! `EVENT_THRESHOLD` is equivalent to 312 bytes. This was decided based on
492    //! the size of `Event` at the time of writing. The assertions here are to
493    //! ensure that in the case the events themselves grow or shrink past the
494    //! threshold, they are properly boxed or unboxed respectively.
495    //!
496    //! If a field has been added to an event in the "unboxed" section and its
497    //! assertion now fails, then you will need to wrap the event in a box in
498    //! the `Event` type and move the assertion to the "boxed" section.
499    //!
500    //! Likewise, if a field has been removed from an event in the "boxed"
501    //! section and the assertion now fails, you will need to remove the box
502    //! wrapping the event in the `Event` type and move the assertion to the
503    //! "unboxed" section.
504
505    use super::{super::payload::incoming::*, Event};
506    use static_assertions::const_assert;
507    use std::mem;
508
509    // `dead_code`: `const_assert` operates at the compiler level, and the lint
510    // requires a variable to be used in a function, so this is a false
511    // positive.
512    #[allow(dead_code)]
513    const EVENT_THRESHOLD: usize = 312;
514
515    const_assert!(mem::size_of::<Event>() == EVENT_THRESHOLD);
516
517    // Boxed events.
518    const_assert!(mem::size_of::<ChannelCreate>() > EVENT_THRESHOLD);
519    const_assert!(mem::size_of::<ChannelDelete>() > EVENT_THRESHOLD);
520    const_assert!(mem::size_of::<ChannelUpdate>() > EVENT_THRESHOLD);
521    const_assert!(mem::size_of::<GuildScheduledEventCreate>() > EVENT_THRESHOLD);
522    const_assert!(mem::size_of::<GuildScheduledEventDelete>() > EVENT_THRESHOLD);
523    const_assert!(mem::size_of::<GuildScheduledEventUpdate>() > EVENT_THRESHOLD);
524    const_assert!(mem::size_of::<GuildUpdate>() > EVENT_THRESHOLD);
525    const_assert!(mem::size_of::<IntegrationCreate>() > EVENT_THRESHOLD);
526    const_assert!(mem::size_of::<IntegrationUpdate>() > EVENT_THRESHOLD);
527    const_assert!(mem::size_of::<InviteCreate>() > EVENT_THRESHOLD);
528    const_assert!(mem::size_of::<InteractionCreate>() > EVENT_THRESHOLD);
529    const_assert!(mem::size_of::<MemberAdd>() > EVENT_THRESHOLD);
530    const_assert!(mem::size_of::<MemberUpdate>() > EVENT_THRESHOLD);
531    const_assert!(mem::size_of::<MessageCreate>() > EVENT_THRESHOLD);
532    const_assert!(mem::size_of::<MessageUpdate>() > EVENT_THRESHOLD);
533    const_assert!(mem::size_of::<PresenceUpdate>() > EVENT_THRESHOLD);
534    const_assert!(mem::size_of::<ReactionAdd>() > EVENT_THRESHOLD);
535    const_assert!(mem::size_of::<ReactionRemove>() > EVENT_THRESHOLD);
536    const_assert!(mem::size_of::<ThreadCreate>() > EVENT_THRESHOLD);
537    const_assert!(mem::size_of::<ThreadMemberUpdate>() > EVENT_THRESHOLD);
538    const_assert!(mem::size_of::<ThreadUpdate>() > EVENT_THRESHOLD);
539    const_assert!(mem::size_of::<TypingStart>() > EVENT_THRESHOLD);
540
541    // Unboxed.
542    const_assert!(mem::size_of::<AutoModerationRuleCreate>() <= EVENT_THRESHOLD);
543    const_assert!(mem::size_of::<AutoModerationRuleDelete>() <= EVENT_THRESHOLD);
544    const_assert!(mem::size_of::<AutoModerationRuleUpdate>() <= EVENT_THRESHOLD);
545    const_assert!(mem::size_of::<AutoModerationActionExecution>() <= EVENT_THRESHOLD);
546    const_assert!(mem::size_of::<BanAdd>() <= EVENT_THRESHOLD);
547    const_assert!(mem::size_of::<BanRemove>() <= EVENT_THRESHOLD);
548    const_assert!(mem::size_of::<ChannelPinsUpdate>() <= EVENT_THRESHOLD);
549    const_assert!(mem::size_of::<CommandPermissionsUpdate>() <= EVENT_THRESHOLD);
550    const_assert!(mem::size_of::<GuildDelete>() <= EVENT_THRESHOLD);
551    const_assert!(mem::size_of::<GuildEmojisUpdate>() <= EVENT_THRESHOLD);
552    const_assert!(mem::size_of::<GuildIntegrationsUpdate>() <= EVENT_THRESHOLD);
553    const_assert!(mem::size_of::<GuildScheduledEventUserAdd>() <= EVENT_THRESHOLD);
554    const_assert!(mem::size_of::<GuildScheduledEventUserRemove>() <= EVENT_THRESHOLD);
555    const_assert!(mem::size_of::<IntegrationDelete>() <= EVENT_THRESHOLD);
556    const_assert!(mem::size_of::<InviteDelete>() <= EVENT_THRESHOLD);
557    const_assert!(mem::size_of::<MemberChunk>() <= EVENT_THRESHOLD);
558    const_assert!(mem::size_of::<MessageDelete>() <= EVENT_THRESHOLD);
559    const_assert!(mem::size_of::<MessageDeleteBulk>() <= EVENT_THRESHOLD);
560    const_assert!(mem::size_of::<MemberRemove>() <= EVENT_THRESHOLD);
561    const_assert!(mem::size_of::<RateLimited>() <= EVENT_THRESHOLD);
562    const_assert!(mem::size_of::<Ready>() <= EVENT_THRESHOLD);
563    const_assert!(mem::size_of::<ReactionRemoveAll>() <= EVENT_THRESHOLD);
564    const_assert!(mem::size_of::<RoleCreate>() <= EVENT_THRESHOLD);
565    const_assert!(mem::size_of::<RoleDelete>() <= EVENT_THRESHOLD);
566    const_assert!(mem::size_of::<RoleUpdate>() <= EVENT_THRESHOLD);
567    const_assert!(mem::size_of::<StageInstanceCreate>() <= EVENT_THRESHOLD);
568    const_assert!(mem::size_of::<StageInstanceDelete>() <= EVENT_THRESHOLD);
569    const_assert!(mem::size_of::<StageInstanceUpdate>() <= EVENT_THRESHOLD);
570    const_assert!(mem::size_of::<ThreadDelete>() <= EVENT_THRESHOLD);
571    const_assert!(mem::size_of::<ThreadListSync>() <= EVENT_THRESHOLD);
572    const_assert!(mem::size_of::<ThreadMembersUpdate>() <= EVENT_THRESHOLD);
573    const_assert!(mem::size_of::<UnavailableGuild>() <= EVENT_THRESHOLD);
574    const_assert!(mem::size_of::<UserUpdate>() <= EVENT_THRESHOLD);
575    const_assert!(mem::size_of::<VoiceServerUpdate>() <= EVENT_THRESHOLD);
576    const_assert!(mem::size_of::<WebhooksUpdate>() <= EVENT_THRESHOLD);
577    const_assert!(mem::size_of::<MessagePollVoteAdd>() <= EVENT_THRESHOLD);
578    const_assert!(mem::size_of::<MessagePollVoteRemove>() <= EVENT_THRESHOLD);
579}