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