titanium_gateway/
event.rs

1//! Gateway event parsing and dispatch.
2//!
3//! This module provides zero-copy event parsing where possible,
4//! using boxed event data to minimize memory overhead for large events.
5//!
6//! # Event Types
7//!
8//! All Discord Gateway events from API v10/11 are supported:
9//! - Connection events (Ready, Resumed)
10//! - Guild events (Create, Update, Delete, Member changes, etc.)
11//! - Channel events (Create, Update, Delete, Threads)
12//! - Message events (Create, Update, Delete, Reactions)
13//! - Interaction events (Slash commands, Buttons, Modals)
14//! - Voice events (State, Server updates)
15//! - AutoMod events (Rules and actions)
16//! - Monetization events (Entitlements, Subscriptions)
17//! - And many more...
18
19use crate::error::GatewayError;
20use titanium_model::voice::{
21    VoiceChannelEffectSendEvent, VoiceServerUpdateEvent, VoiceStateUpdateEvent,
22};
23pub use titanium_model::*;
24
25/// Parsed Gateway event ready for handler dispatch.
26///
27/// Events are parsed from Dispatch payloads (opcode 0). Each variant
28/// corresponds to a Discord Gateway event type.
29#[derive(Debug, Clone)]
30#[non_exhaustive]
31pub enum Event<'a> {
32    // =========================================================================
33    // Connection Events
34    // =========================================================================
35    /// Received after successful Identify.
36    Ready(Box<ReadyEventData<'a>>),
37
38    /// Received after successful Resume.
39    Resumed,
40
41    // =========================================================================
42    // Guild Events
43    // =========================================================================
44    /// Lazy-load for unavailable guild, or guild joined.
45    GuildCreate(Box<Guild<'a>>),
46
47    /// Guild was updated.
48    GuildUpdate(Box<Guild<'a>>),
49
50    /// Guild was deleted or became unavailable.
51    GuildDelete(UnavailableGuild),
52
53    /// User was banned from guild.
54    GuildBanAdd(Box<GuildBanEvent<'a>>),
55
56    /// User was unbanned from guild.
57    GuildBanRemove(Box<GuildBanEvent<'a>>),
58
59    /// Guild emojis were updated.
60    GuildEmojisUpdate(Box<GuildEmojisUpdateEvent<'a>>),
61
62    /// Guild stickers were updated.
63    GuildStickersUpdate(Box<GuildStickersUpdateEvent<'a>>),
64
65    /// Guild integrations were updated.
66    GuildIntegrationsUpdate(Box<GuildIntegrationsUpdateEvent>),
67
68    /// Audit log entry was created.
69    GuildAuditLogEntryCreate(Box<AuditLogEntry>),
70
71    // =========================================================================
72    // Guild Member Events
73    // =========================================================================
74    /// New member joined guild.
75    GuildMemberAdd(Box<GuildMemberAddEvent<'a>>),
76
77    /// Member was removed from guild.
78    GuildMemberRemove(Box<GuildMemberRemoveEvent<'a>>),
79
80    /// Member was updated.
81    GuildMemberUpdate(Box<GuildMemberUpdateEvent<'a>>),
82
83    /// Response to Request Guild Members.
84    GuildMembersChunk(Box<GuildMembersChunkEvent<'a>>),
85
86    // =========================================================================
87    // Role Events
88    // =========================================================================
89    /// Role was created.
90    GuildRoleCreate(Box<GuildRoleEvent<'a>>),
91
92    /// Role was updated.
93    GuildRoleUpdate(Box<GuildRoleEvent<'a>>),
94
95    /// Role was deleted.
96    GuildRoleDelete(Box<GuildRoleDeleteEvent>),
97
98    // =========================================================================
99    // Channel Events
100    // =========================================================================
101    /// Channel was created.
102    ChannelCreate(Box<Channel<'a>>),
103
104    /// Channel was updated.
105    ChannelUpdate(Box<Channel<'a>>),
106
107    /// Channel was deleted.
108    ChannelDelete(Box<Channel<'a>>),
109
110    /// Message was pinned/unpinned.
111    ChannelPinsUpdate(Box<ChannelPinsUpdateEvent>),
112
113    // =========================================================================
114    // Thread Events
115    // =========================================================================
116    /// Thread was created.
117    ThreadCreate(Box<Channel<'a>>),
118
119    /// Thread was updated.
120    ThreadUpdate(Box<Channel<'a>>),
121
122    /// Thread was deleted.
123    ThreadDelete(Box<ThreadDeleteEvent>),
124
125    /// Sent when gaining access to a channel with threads.
126    ThreadListSync(Box<ThreadListSyncEvent<'a>>),
127
128    /// Current user's thread member was updated.
129    ThreadMemberUpdate(Box<ThreadMemberUpdateEvent<'a>>),
130
131    /// Users were added/removed from a thread.
132    ThreadMembersUpdate(Box<ThreadMembersUpdateEvent<'a>>),
133
134    // =========================================================================
135    // Message Events
136    // =========================================================================
137    /// Message was created.
138    MessageCreate(Box<Message<'a>>),
139
140    /// Message was updated.
141    MessageUpdate(Box<MessageUpdateEvent<'a>>),
142
143    /// Message was deleted.
144    MessageDelete(MessageDeleteEvent),
145
146    /// Multiple messages were deleted (bulk).
147    MessageDeleteBulk(MessageDeleteBulkEvent),
148
149    // =========================================================================
150    // Reaction Events
151    // =========================================================================
152    /// Reaction was added to a message.
153    MessageReactionAdd(Box<MessageReactionAddEvent<'a>>),
154
155    /// Reaction was removed from a message.
156    MessageReactionRemove(Box<MessageReactionRemoveEvent<'a>>),
157
158    /// All reactions were removed from a message.
159    MessageReactionRemoveAll(Box<MessageReactionRemoveAllEvent>),
160
161    /// All reactions for an emoji were removed.
162    MessageReactionRemoveEmoji(Box<MessageReactionRemoveEmojiEvent<'a>>),
163
164    // =========================================================================
165    // Interaction Events
166    // =========================================================================
167    /// An interaction was created (slash command, button, modal, etc.).
168    InteractionCreate(Box<Interaction<'a>>),
169
170    // =========================================================================
171    // Invite Events
172    // =========================================================================
173    /// Invite was created.
174    InviteCreate(Box<InviteCreateEvent<'a>>),
175
176    /// Invite was deleted.
177    InviteDelete(Box<InviteDeleteEvent<'a>>),
178
179    // =========================================================================
180    // Stage Instance Events
181    // =========================================================================
182    /// Stage instance was created.
183    StageInstanceCreate(Box<StageInstance>),
184
185    /// Stage instance was updated.
186    StageInstanceUpdate(Box<StageInstance>),
187
188    /// Stage instance was deleted.
189    StageInstanceDelete(Box<StageInstance>),
190
191    // =========================================================================
192    // Scheduled Event Events
193    // =========================================================================
194    /// Scheduled event was created.
195    GuildScheduledEventCreate(Box<ScheduledEvent<'a>>),
196
197    /// Scheduled event was updated.
198    GuildScheduledEventUpdate(Box<ScheduledEvent<'a>>),
199
200    /// Scheduled event was deleted.
201    GuildScheduledEventDelete(Box<ScheduledEvent<'a>>),
202
203    /// User subscribed to scheduled event.
204    GuildScheduledEventUserAdd(Box<ScheduledEventUserEvent>),
205
206    /// User unsubscribed from scheduled event.
207    GuildScheduledEventUserRemove(Box<ScheduledEventUserEvent>),
208
209    // =========================================================================
210    // AutoMod Events
211    // =========================================================================
212    /// AutoMod rule was created.
213    AutoModerationRuleCreate(Box<AutoModRule>),
214
215    /// AutoMod rule was updated.
216    AutoModerationRuleUpdate(Box<AutoModRule>),
217
218    /// AutoMod rule was deleted.
219    AutoModerationRuleDelete(Box<AutoModRule>),
220
221    /// AutoMod action was executed.
222    AutoModerationActionExecution(Box<AutoModActionExecution>),
223
224    // =========================================================================
225    // Integration Events
226    // =========================================================================
227    /// Integration was created.
228    IntegrationCreate(Box<Integration<'a>>),
229
230    /// Integration was updated.
231    IntegrationUpdate(Box<Integration<'a>>),
232
233    /// Integration was deleted.
234    IntegrationDelete(Box<IntegrationDeleteEvent>),
235
236    // =========================================================================
237    // Webhook Events
238    // =========================================================================
239    /// Webhooks were updated in a channel.
240    WebhooksUpdate(Box<WebhooksUpdateEvent>),
241
242    // =========================================================================
243    // Monetization Events
244    // =========================================================================
245    /// Entitlement was created.
246    EntitlementCreate(Box<Entitlement>),
247
248    /// Entitlement was updated.
249    EntitlementUpdate(Box<Entitlement>),
250
251    /// Entitlement was deleted.
252    EntitlementDelete(Box<Entitlement>),
253
254    /// Subscription was created.
255    SubscriptionCreate(Box<Subscription>),
256
257    /// Subscription was updated.
258    SubscriptionUpdate(Box<Subscription>),
259
260    /// Subscription was deleted.
261    SubscriptionDelete(Box<Subscription>),
262
263    // =========================================================================
264    // Soundboard Events
265    // =========================================================================
266    /// Soundboard sound was created in a guild.
267    SoundboardSoundCreate(Box<SoundboardSound<'a>>),
268
269    /// Soundboard sound was updated in a guild.
270    SoundboardSoundUpdate(Box<SoundboardSound<'a>>),
271
272    /// Soundboard sound was deleted in a guild.
273    SoundboardSoundDelete(Box<SoundboardSoundDeleteEvent>),
274
275    /// Multiple soundboard sounds were updated.
276    SoundboardSoundsUpdate(Box<SoundboardSoundsUpdateEvent<'a>>),
277
278    /// Guild soundboard sounds were updated.
279    GuildSoundboardSoundsUpdate(Box<GuildSoundboardSoundsUpdateEvent<'a>>),
280
281    // =========================================================================
282    // Presence & Typing Events
283    // =========================================================================
284    /// User started typing.
285    TypingStart(Box<TypingStartEvent<'a>>),
286
287    /// User's presence was updated.
288    PresenceUpdate(Box<PresenceUpdateEvent>),
289
290    /// Current user was updated.
291    UserUpdate(Box<User<'a>>),
292
293    // =========================================================================
294    // Voice Events
295    // =========================================================================
296    /// Voice state was updated.
297    VoiceStateUpdate(Box<VoiceStateUpdateEvent<'a>>),
298
299    /// Voice server information received.
300    VoiceServerUpdate(VoiceServerUpdateEvent),
301
302    /// Voice channel effect was sent.
303    VoiceChannelEffectSend(Box<VoiceChannelEffectSendEvent<'a>>),
304
305    // =========================================================================
306    // Unknown / Raw Event
307    // =========================================================================
308    /// Unknown event type - contains raw JSON for custom handling.
309    Unknown {
310        /// The event name.
311        name: String,
312        /// Raw JSON data.
313        data: titanium_model::json::Value,
314    },
315}
316
317// ============================================================================
318// Event Data Structures
319// ============================================================================
320
321// Note: Most event data structures are now imported from titan-model.
322
323// ============================================================================
324// Event Parsing
325// ============================================================================
326
327/// Parse an event from its name and raw JSON data.
328///
329/// This function uses a match block for O(1) event dispatch without
330/// unnecessary allocations. Events are boxed to minimize enum size.
331#[cfg(not(feature = "simd"))]
332pub fn parse_event(
333    event_name: &str,
334    data: &serde_json::value::RawValue,
335) -> Result<Event<'static>, GatewayError> {
336    let json_str = data.get();
337
338    match event_name {
339        // Connection Events
340        "READY" => {
341            let ready: ReadyEventData = serde_json::from_str(json_str)?;
342            Ok(Event::Ready(Box::new(ready)))
343        }
344        "RESUMED" => Ok(Event::Resumed),
345
346        // Guild Events
347        "GUILD_CREATE" => {
348            let guild: Guild = serde_json::from_str(json_str)?;
349            Ok(Event::GuildCreate(Box::new(guild)))
350        }
351        "GUILD_UPDATE" => {
352            let guild: Guild = serde_json::from_str(json_str)?;
353            Ok(Event::GuildUpdate(Box::new(guild)))
354        }
355        "GUILD_DELETE" => {
356            let guild: UnavailableGuild = serde_json::from_str(json_str)?;
357            Ok(Event::GuildDelete(guild))
358        }
359        "GUILD_BAN_ADD" => {
360            let ban: GuildBanEvent = serde_json::from_str(json_str)?;
361            Ok(Event::GuildBanAdd(Box::new(ban)))
362        }
363        "GUILD_BAN_REMOVE" => {
364            let ban: GuildBanEvent = serde_json::from_str(json_str)?;
365            Ok(Event::GuildBanRemove(Box::new(ban)))
366        }
367        "GUILD_EMOJIS_UPDATE" => {
368            let emojis: GuildEmojisUpdateEvent = serde_json::from_str(json_str)?;
369            Ok(Event::GuildEmojisUpdate(Box::new(emojis)))
370        }
371        "GUILD_STICKERS_UPDATE" => {
372            let stickers: GuildStickersUpdateEvent = serde_json::from_str(json_str)?;
373            Ok(Event::GuildStickersUpdate(Box::new(stickers)))
374        }
375        "GUILD_INTEGRATIONS_UPDATE" => {
376            let integrations: GuildIntegrationsUpdateEvent = serde_json::from_str(json_str)?;
377            Ok(Event::GuildIntegrationsUpdate(Box::new(integrations)))
378        }
379        "GUILD_AUDIT_LOG_ENTRY_CREATE" => {
380            let entry: AuditLogEntry = serde_json::from_str(json_str)?;
381            Ok(Event::GuildAuditLogEntryCreate(Box::new(entry)))
382        }
383
384        // Guild Member Events
385        "GUILD_MEMBER_ADD" => {
386            let member: GuildMemberAddEvent = serde_json::from_str(json_str)?;
387            Ok(Event::GuildMemberAdd(Box::new(member)))
388        }
389        "GUILD_MEMBER_REMOVE" => {
390            let member: GuildMemberRemoveEvent = serde_json::from_str(json_str)?;
391            Ok(Event::GuildMemberRemove(Box::new(member)))
392        }
393        "GUILD_MEMBER_UPDATE" => {
394            let member: GuildMemberUpdateEvent = serde_json::from_str(json_str)?;
395            Ok(Event::GuildMemberUpdate(Box::new(member)))
396        }
397        "GUILD_MEMBERS_CHUNK" => {
398            let chunk: GuildMembersChunkEvent = serde_json::from_str(json_str)?;
399            Ok(Event::GuildMembersChunk(Box::new(chunk)))
400        }
401
402        // Role Events
403        "GUILD_ROLE_CREATE" => {
404            let role: GuildRoleEvent = serde_json::from_str(json_str)?;
405            Ok(Event::GuildRoleCreate(Box::new(role)))
406        }
407        "GUILD_ROLE_UPDATE" => {
408            let role: GuildRoleEvent = serde_json::from_str(json_str)?;
409            Ok(Event::GuildRoleUpdate(Box::new(role)))
410        }
411        "GUILD_ROLE_DELETE" => {
412            let role: GuildRoleDeleteEvent = serde_json::from_str(json_str)?;
413            Ok(Event::GuildRoleDelete(Box::new(role)))
414        }
415
416        // Channel Events
417        "CHANNEL_CREATE" => {
418            let channel: Channel = serde_json::from_str(json_str)?;
419            Ok(Event::ChannelCreate(Box::new(channel)))
420        }
421        "CHANNEL_UPDATE" => {
422            let channel: Channel = serde_json::from_str(json_str)?;
423            Ok(Event::ChannelUpdate(Box::new(channel)))
424        }
425        "CHANNEL_DELETE" => {
426            let channel: Channel = serde_json::from_str(json_str)?;
427            Ok(Event::ChannelDelete(Box::new(channel)))
428        }
429        "CHANNEL_PINS_UPDATE" => {
430            let pins: ChannelPinsUpdateEvent = serde_json::from_str(json_str)?;
431            Ok(Event::ChannelPinsUpdate(Box::new(pins)))
432        }
433
434        // Thread Events
435        "THREAD_CREATE" => {
436            let thread: Channel = serde_json::from_str(json_str)?;
437            Ok(Event::ThreadCreate(Box::new(thread)))
438        }
439        "THREAD_UPDATE" => {
440            let thread: Channel = serde_json::from_str(json_str)?;
441            Ok(Event::ThreadUpdate(Box::new(thread)))
442        }
443        "THREAD_DELETE" => {
444            let thread: ThreadDeleteEvent = serde_json::from_str(json_str)?;
445            Ok(Event::ThreadDelete(Box::new(thread)))
446        }
447        "THREAD_LIST_SYNC" => {
448            let sync: ThreadListSyncEvent = serde_json::from_str(json_str)?;
449            Ok(Event::ThreadListSync(Box::new(sync)))
450        }
451        "THREAD_MEMBER_UPDATE" => {
452            let member: ThreadMemberUpdateEvent = serde_json::from_str(json_str)?;
453            Ok(Event::ThreadMemberUpdate(Box::new(member)))
454        }
455        "THREAD_MEMBERS_UPDATE" => {
456            let members: ThreadMembersUpdateEvent = serde_json::from_str(json_str)?;
457            Ok(Event::ThreadMembersUpdate(Box::new(members)))
458        }
459
460        // Message Events
461        "MESSAGE_CREATE" => {
462            let message: Message = serde_json::from_str(json_str)?;
463            Ok(Event::MessageCreate(Box::new(message)))
464        }
465        "MESSAGE_UPDATE" => {
466            let update: MessageUpdateEvent = serde_json::from_str(json_str)?;
467            Ok(Event::MessageUpdate(Box::new(update)))
468        }
469        "MESSAGE_DELETE" => {
470            let delete: MessageDeleteEvent = serde_json::from_str(json_str)?;
471            Ok(Event::MessageDelete(delete))
472        }
473        "MESSAGE_DELETE_BULK" => {
474            let delete_bulk: MessageDeleteBulkEvent = serde_json::from_str(json_str)?;
475            Ok(Event::MessageDeleteBulk(delete_bulk))
476        }
477
478        // Reaction Events
479        "MESSAGE_REACTION_ADD" => {
480            let reaction: MessageReactionAddEvent = serde_json::from_str(json_str)?;
481            Ok(Event::MessageReactionAdd(Box::new(reaction)))
482        }
483        "MESSAGE_REACTION_REMOVE" => {
484            let reaction: MessageReactionRemoveEvent = serde_json::from_str(json_str)?;
485            Ok(Event::MessageReactionRemove(Box::new(reaction)))
486        }
487        "MESSAGE_REACTION_REMOVE_ALL" => {
488            let reaction: MessageReactionRemoveAllEvent = serde_json::from_str(json_str)?;
489            Ok(Event::MessageReactionRemoveAll(Box::new(reaction)))
490        }
491        "MESSAGE_REACTION_REMOVE_EMOJI" => {
492            let reaction: MessageReactionRemoveEmojiEvent = serde_json::from_str(json_str)?;
493            Ok(Event::MessageReactionRemoveEmoji(Box::new(reaction)))
494        }
495
496        // Interaction Events
497        "INTERACTION_CREATE" => {
498            let interaction: Interaction = serde_json::from_str(json_str)?;
499            Ok(Event::InteractionCreate(Box::new(interaction)))
500        }
501
502        // Invite Events
503        "INVITE_CREATE" => {
504            let invite: InviteCreateEvent = serde_json::from_str(json_str)?;
505            Ok(Event::InviteCreate(Box::new(invite)))
506        }
507        "INVITE_DELETE" => {
508            let invite: InviteDeleteEvent = serde_json::from_str(json_str)?;
509            Ok(Event::InviteDelete(Box::new(invite)))
510        }
511
512        // Stage Instance Events
513        "STAGE_INSTANCE_CREATE" => {
514            let stage: StageInstance = serde_json::from_str(json_str)?;
515            Ok(Event::StageInstanceCreate(Box::new(stage)))
516        }
517        "STAGE_INSTANCE_UPDATE" => {
518            let stage: StageInstance = serde_json::from_str(json_str)?;
519            Ok(Event::StageInstanceUpdate(Box::new(stage)))
520        }
521        "STAGE_INSTANCE_DELETE" => {
522            let stage: StageInstance = serde_json::from_str(json_str)?;
523            Ok(Event::StageInstanceDelete(Box::new(stage)))
524        }
525
526        // Scheduled Event Events
527        "GUILD_SCHEDULED_EVENT_CREATE" => {
528            let event: ScheduledEvent = serde_json::from_str(json_str)?;
529            Ok(Event::GuildScheduledEventCreate(Box::new(event)))
530        }
531        "GUILD_SCHEDULED_EVENT_UPDATE" => {
532            let event: ScheduledEvent = serde_json::from_str(json_str)?;
533            Ok(Event::GuildScheduledEventUpdate(Box::new(event)))
534        }
535        "GUILD_SCHEDULED_EVENT_DELETE" => {
536            let event: ScheduledEvent = serde_json::from_str(json_str)?;
537            Ok(Event::GuildScheduledEventDelete(Box::new(event)))
538        }
539        "GUILD_SCHEDULED_EVENT_USER_ADD" => {
540            let event: ScheduledEventUserEvent = serde_json::from_str(json_str)?;
541            Ok(Event::GuildScheduledEventUserAdd(Box::new(event)))
542        }
543        "GUILD_SCHEDULED_EVENT_USER_REMOVE" => {
544            let event: ScheduledEventUserEvent = serde_json::from_str(json_str)?;
545            Ok(Event::GuildScheduledEventUserRemove(Box::new(event)))
546        }
547
548        // AutoMod Events
549        "AUTO_MODERATION_RULE_CREATE" => {
550            let rule: AutoModRule = serde_json::from_str(json_str)?;
551            Ok(Event::AutoModerationRuleCreate(Box::new(rule)))
552        }
553        "AUTO_MODERATION_RULE_UPDATE" => {
554            let rule: AutoModRule = serde_json::from_str(json_str)?;
555            Ok(Event::AutoModerationRuleUpdate(Box::new(rule)))
556        }
557        "AUTO_MODERATION_RULE_DELETE" => {
558            let rule: AutoModRule = serde_json::from_str(json_str)?;
559            Ok(Event::AutoModerationRuleDelete(Box::new(rule)))
560        }
561        "AUTO_MODERATION_ACTION_EXECUTION" => {
562            let action: AutoModActionExecution = serde_json::from_str(json_str)?;
563            Ok(Event::AutoModerationActionExecution(Box::new(action)))
564        }
565
566        // Integration Events
567        "INTEGRATION_CREATE" => {
568            let integration: Integration = serde_json::from_str(json_str)?;
569            Ok(Event::IntegrationCreate(Box::new(integration)))
570        }
571        "INTEGRATION_UPDATE" => {
572            let integration: Integration = serde_json::from_str(json_str)?;
573            Ok(Event::IntegrationUpdate(Box::new(integration)))
574        }
575        "INTEGRATION_DELETE" => {
576            let integration: IntegrationDeleteEvent = serde_json::from_str(json_str)?;
577            Ok(Event::IntegrationDelete(Box::new(integration)))
578        }
579
580        // Webhook Events
581        "WEBHOOKS_UPDATE" => {
582            let webhooks: WebhooksUpdateEvent = serde_json::from_str(json_str)?;
583            Ok(Event::WebhooksUpdate(Box::new(webhooks)))
584        }
585
586        // Monetization Events
587        "ENTITLEMENT_CREATE" => {
588            let entitlement: Entitlement = serde_json::from_str(json_str)?;
589            Ok(Event::EntitlementCreate(Box::new(entitlement)))
590        }
591        "ENTITLEMENT_UPDATE" => {
592            let entitlement: Entitlement = serde_json::from_str(json_str)?;
593            Ok(Event::EntitlementUpdate(Box::new(entitlement)))
594        }
595        "ENTITLEMENT_DELETE" => {
596            let entitlement: Entitlement = serde_json::from_str(json_str)?;
597            Ok(Event::EntitlementDelete(Box::new(entitlement)))
598        }
599        "SUBSCRIPTION_CREATE" => {
600            let subscription: Subscription = serde_json::from_str(json_str)?;
601            Ok(Event::SubscriptionCreate(Box::new(subscription)))
602        }
603        "SUBSCRIPTION_UPDATE" => {
604            let subscription: Subscription = serde_json::from_str(json_str)?;
605            Ok(Event::SubscriptionUpdate(Box::new(subscription)))
606        }
607        "SUBSCRIPTION_DELETE" => {
608            let subscription: Subscription = serde_json::from_str(json_str)?;
609            Ok(Event::SubscriptionDelete(Box::new(subscription)))
610        }
611
612        // Soundboard Events
613        "SOUNDBOARD_SOUND_CREATE" => {
614            let sound: SoundboardSound = serde_json::from_str(json_str)?;
615            Ok(Event::SoundboardSoundCreate(Box::new(sound)))
616        }
617        "SOUNDBOARD_SOUND_UPDATE" => {
618            let sound: SoundboardSound = serde_json::from_str(json_str)?;
619            Ok(Event::SoundboardSoundUpdate(Box::new(sound)))
620        }
621        "SOUNDBOARD_SOUND_DELETE" => {
622            let sound: SoundboardSoundDeleteEvent = serde_json::from_str(json_str)?;
623            Ok(Event::SoundboardSoundDelete(Box::new(sound)))
624        }
625        "SOUNDBOARD_SOUNDS_UPDATE" => {
626            let sounds: SoundboardSoundsUpdateEvent = serde_json::from_str(json_str)?;
627            Ok(Event::SoundboardSoundsUpdate(Box::new(sounds)))
628        }
629        "GUILD_SOUNDBOARD_SOUNDS_UPDATE" => {
630            let sounds: GuildSoundboardSoundsUpdateEvent = serde_json::from_str(json_str)?;
631            Ok(Event::GuildSoundboardSoundsUpdate(Box::new(sounds)))
632        }
633
634        // Presence & Typing Events
635        "TYPING_START" => {
636            let typing: TypingStartEvent = serde_json::from_str(json_str)?;
637            Ok(Event::TypingStart(typing))
638        }
639        "PRESENCE_UPDATE" => {
640            let presence: PresenceUpdateEvent = serde_json::from_str(json_str)?;
641            Ok(Event::PresenceUpdate(Box::new(presence)))
642        }
643        "USER_UPDATE" => {
644            let user: User = serde_json::from_str(json_str)?;
645            Ok(Event::UserUpdate(Box::new(user)))
646        }
647
648        // Voice Events
649        "VOICE_STATE_UPDATE" => {
650            let voice_state: VoiceStateUpdateEvent = serde_json::from_str(json_str)?;
651            Ok(Event::VoiceStateUpdate(Box::new(voice_state)))
652        }
653        "VOICE_SERVER_UPDATE" => {
654            let voice_server: VoiceServerUpdateEvent = serde_json::from_str(json_str)?;
655            Ok(Event::VoiceServerUpdate(voice_server))
656        }
657        "VOICE_CHANNEL_EFFECT_SEND" => {
658            let effect: VoiceChannelEffectSendEvent = serde_json::from_str(json_str)?;
659            Ok(Event::VoiceChannelEffectSend(Box::new(effect)))
660        }
661
662        // Unknown event - parse as generic JSON Value
663        _ => {
664            let value: serde_json::Value = serde_json::from_str(json_str)?;
665            Ok(Event::Unknown {
666                name: event_name.to_owned(),
667                data: value,
668            })
669        }
670    }
671}
672
673/// Parse an event from its name and parsed JSON Value (SIMD).
674#[cfg(feature = "simd")]
675pub fn parse_event<'a>(
676    event_name: &str,
677    data: titanium_model::json::BorrowedValue<'a>,
678) -> Result<Event<'static>, GatewayError> {
679    match event_name {
680        // Connection Events
681        "READY" => {
682            let ready: ReadyEventData = titanium_model::json::from_borrowed_value(data)?;
683            Ok(Event::Ready(Box::new(ready)))
684        }
685        "RESUMED" => Ok(Event::Resumed),
686
687        // Guild Events
688        "GUILD_CREATE" => {
689            let guild: Guild = titanium_model::json::from_borrowed_value(data)?;
690            Ok(Event::GuildCreate(Box::new(guild)))
691        }
692        "GUILD_UPDATE" => {
693            let guild: Guild = titanium_model::json::from_borrowed_value(data)?;
694            Ok(Event::GuildUpdate(Box::new(guild)))
695        }
696        "GUILD_DELETE" => {
697            let guild: UnavailableGuild = titanium_model::json::from_borrowed_value(data)?;
698            Ok(Event::GuildDelete(guild))
699        }
700        "GUILD_BAN_ADD" => {
701            let ban: GuildBanEvent = titanium_model::json::from_borrowed_value(data)?;
702            Ok(Event::GuildBanAdd(Box::new(ban)))
703        }
704        "GUILD_BAN_REMOVE" => {
705            let ban: GuildBanEvent = titanium_model::json::from_borrowed_value(data)?;
706            Ok(Event::GuildBanRemove(Box::new(ban)))
707        }
708        "GUILD_EMOJIS_UPDATE" => {
709            let emojis: GuildEmojisUpdateEvent = titanium_model::json::from_borrowed_value(data)?;
710            Ok(Event::GuildEmojisUpdate(Box::new(emojis)))
711        }
712        "GUILD_STICKERS_UPDATE" => {
713            let stickers: GuildStickersUpdateEvent = titanium_model::json::from_borrowed_value(data)?;
714            Ok(Event::GuildStickersUpdate(Box::new(stickers)))
715        }
716        "GUILD_INTEGRATIONS_UPDATE" => {
717            let integrations: GuildIntegrationsUpdateEvent =
718                titanium_model::json::from_borrowed_value(data)?;
719            Ok(Event::GuildIntegrationsUpdate(Box::new(integrations)))
720        }
721        "GUILD_AUDIT_LOG_ENTRY_CREATE" => {
722            let entry: AuditLogEntry = titanium_model::json::from_borrowed_value(data)?;
723            Ok(Event::GuildAuditLogEntryCreate(Box::new(entry)))
724        }
725
726        // Guild Member Events
727        "GUILD_MEMBER_ADD" => {
728            let member: GuildMemberAddEvent = titanium_model::json::from_borrowed_value(data)?;
729            Ok(Event::GuildMemberAdd(Box::new(member)))
730        }
731        "GUILD_MEMBER_REMOVE" => {
732            let member: GuildMemberRemoveEvent = titanium_model::json::from_borrowed_value(data)?;
733            Ok(Event::GuildMemberRemove(Box::new(member)))
734        }
735        "GUILD_MEMBER_UPDATE" => {
736            let member: GuildMemberUpdateEvent = titanium_model::json::from_borrowed_value(data)?;
737            Ok(Event::GuildMemberUpdate(Box::new(member)))
738        }
739        "GUILD_MEMBERS_CHUNK" => {
740            let chunk: GuildMembersChunkEvent = titanium_model::json::from_borrowed_value(data)?;
741            Ok(Event::GuildMembersChunk(Box::new(chunk)))
742        }
743
744        // Role Events
745        "GUILD_ROLE_CREATE" => {
746            let role: GuildRoleEvent = titanium_model::json::from_borrowed_value(data)?;
747            Ok(Event::GuildRoleCreate(Box::new(role)))
748        }
749        "GUILD_ROLE_UPDATE" => {
750            let role: GuildRoleEvent = titanium_model::json::from_borrowed_value(data)?;
751            Ok(Event::GuildRoleUpdate(Box::new(role)))
752        }
753        "GUILD_ROLE_DELETE" => {
754            let role: GuildRoleDeleteEvent = titanium_model::json::from_borrowed_value(data)?;
755            Ok(Event::GuildRoleDelete(Box::new(role)))
756        }
757
758        // Channel Events
759        "CHANNEL_CREATE" => {
760            let channel: Channel = titanium_model::json::from_borrowed_value(data)?;
761            Ok(Event::ChannelCreate(Box::new(channel)))
762        }
763        "CHANNEL_UPDATE" => {
764            let channel: Channel = titanium_model::json::from_borrowed_value(data)?;
765            Ok(Event::ChannelUpdate(Box::new(channel)))
766        }
767        "CHANNEL_DELETE" => {
768            let channel: Channel = titanium_model::json::from_borrowed_value(data)?;
769            Ok(Event::ChannelDelete(Box::new(channel)))
770        }
771        "CHANNEL_PINS_UPDATE" => {
772            let pins: ChannelPinsUpdateEvent = titanium_model::json::from_borrowed_value(data)?;
773            Ok(Event::ChannelPinsUpdate(Box::new(pins)))
774        }
775
776        // Thread Events
777        "THREAD_CREATE" => {
778            let thread: Channel = titanium_model::json::from_borrowed_value(data)?;
779            Ok(Event::ThreadCreate(Box::new(thread)))
780        }
781        "THREAD_UPDATE" => {
782            let thread: Channel = titanium_model::json::from_borrowed_value(data)?;
783            Ok(Event::ThreadUpdate(Box::new(thread)))
784        }
785        "THREAD_DELETE" => {
786            let thread: ThreadDeleteEvent = titanium_model::json::from_borrowed_value(data)?;
787            Ok(Event::ThreadDelete(Box::new(thread)))
788        }
789        "THREAD_LIST_SYNC" => {
790            let sync: ThreadListSyncEvent = titanium_model::json::from_borrowed_value(data)?;
791            Ok(Event::ThreadListSync(Box::new(sync)))
792        }
793        "THREAD_MEMBER_UPDATE" => {
794            let member: ThreadMemberUpdateEvent = titanium_model::json::from_borrowed_value(data)?;
795            Ok(Event::ThreadMemberUpdate(Box::new(member)))
796        }
797        "THREAD_MEMBERS_UPDATE" => {
798            let members: ThreadMembersUpdateEvent = titanium_model::json::from_borrowed_value(data)?;
799            Ok(Event::ThreadMembersUpdate(Box::new(members)))
800        }
801
802        // Message Events
803        "MESSAGE_CREATE" => {
804            let message: Message = titanium_model::json::from_borrowed_value(data)?;
805            Ok(Event::MessageCreate(Box::new(message)))
806        }
807        "MESSAGE_UPDATE" => {
808            let update: MessageUpdateEvent = titanium_model::json::from_borrowed_value(data)?;
809            Ok(Event::MessageUpdate(Box::new(update)))
810        }
811        "MESSAGE_DELETE" => {
812            let delete: MessageDeleteEvent = titanium_model::json::from_borrowed_value(data)?;
813            Ok(Event::MessageDelete(delete))
814        }
815        "MESSAGE_DELETE_BULK" => {
816            let delete_bulk: MessageDeleteBulkEvent = titanium_model::json::from_borrowed_value(data)?;
817            Ok(Event::MessageDeleteBulk(delete_bulk))
818        }
819
820        // Reaction Events
821        "MESSAGE_REACTION_ADD" => {
822            let reaction: MessageReactionAddEvent = titanium_model::json::from_borrowed_value(data)?;
823            Ok(Event::MessageReactionAdd(Box::new(reaction)))
824        }
825        "MESSAGE_REACTION_REMOVE" => {
826            let reaction: MessageReactionRemoveEvent =
827                titanium_model::json::from_borrowed_value(data)?;
828            Ok(Event::MessageReactionRemove(Box::new(reaction)))
829        }
830        "MESSAGE_REACTION_REMOVE_ALL" => {
831            let reaction: MessageReactionRemoveAllEvent =
832                titanium_model::json::from_borrowed_value(data)?;
833            Ok(Event::MessageReactionRemoveAll(Box::new(reaction)))
834        }
835        "MESSAGE_REACTION_REMOVE_EMOJI" => {
836            let reaction: MessageReactionRemoveEmojiEvent =
837                titanium_model::json::from_borrowed_value(data)?;
838            Ok(Event::MessageReactionRemoveEmoji(Box::new(reaction)))
839        }
840
841        // Interaction Events
842        "INTERACTION_CREATE" => {
843            let interaction: Interaction = titanium_model::json::from_borrowed_value(data)?;
844            Ok(Event::InteractionCreate(Box::new(interaction)))
845        }
846
847        // Invite Events
848        "INVITE_CREATE" => {
849            let invite: InviteCreateEvent = titanium_model::json::from_borrowed_value(data)?;
850            Ok(Event::InviteCreate(Box::new(invite)))
851        }
852        "INVITE_DELETE" => {
853            let invite: InviteDeleteEvent = titanium_model::json::from_borrowed_value(data)?;
854            Ok(Event::InviteDelete(Box::new(invite)))
855        }
856
857        // Stage Instance Events
858        "STAGE_INSTANCE_CREATE" => {
859            let stage: StageInstance = titanium_model::json::from_borrowed_value(data)?;
860            Ok(Event::StageInstanceCreate(Box::new(stage)))
861        }
862        "STAGE_INSTANCE_UPDATE" => {
863            let stage: StageInstance = titanium_model::json::from_borrowed_value(data)?;
864            Ok(Event::StageInstanceUpdate(Box::new(stage)))
865        }
866        "STAGE_INSTANCE_DELETE" => {
867            let stage: StageInstance = titanium_model::json::from_borrowed_value(data)?;
868            Ok(Event::StageInstanceDelete(Box::new(stage)))
869        }
870
871        // Scheduled Event Events
872        "GUILD_SCHEDULED_EVENT_CREATE" => {
873            let event: ScheduledEvent = titanium_model::json::from_borrowed_value(data)?;
874            Ok(Event::GuildScheduledEventCreate(Box::new(event)))
875        }
876        "GUILD_SCHEDULED_EVENT_UPDATE" => {
877            let event: ScheduledEvent = titanium_model::json::from_borrowed_value(data)?;
878            Ok(Event::GuildScheduledEventUpdate(Box::new(event)))
879        }
880        "GUILD_SCHEDULED_EVENT_DELETE" => {
881            let event: ScheduledEvent = titanium_model::json::from_borrowed_value(data)?;
882            Ok(Event::GuildScheduledEventDelete(Box::new(event)))
883        }
884        "GUILD_SCHEDULED_EVENT_USER_ADD" => {
885            let event: ScheduledEventUserEvent = titanium_model::json::from_borrowed_value(data)?;
886            Ok(Event::GuildScheduledEventUserAdd(Box::new(event)))
887        }
888        "GUILD_SCHEDULED_EVENT_USER_REMOVE" => {
889            let event: ScheduledEventUserEvent = titanium_model::json::from_borrowed_value(data)?;
890            Ok(Event::GuildScheduledEventUserRemove(Box::new(event)))
891        }
892
893        // AutoMod Events
894        "AUTO_MODERATION_RULE_CREATE" => {
895            let rule: AutoModRule = titanium_model::json::from_borrowed_value(data)?;
896            Ok(Event::AutoModerationRuleCreate(Box::new(rule)))
897        }
898        "AUTO_MODERATION_RULE_UPDATE" => {
899            let rule: AutoModRule = titanium_model::json::from_borrowed_value(data)?;
900            Ok(Event::AutoModerationRuleUpdate(Box::new(rule)))
901        }
902        "AUTO_MODERATION_RULE_DELETE" => {
903            let rule: AutoModRule = titanium_model::json::from_borrowed_value(data)?;
904            Ok(Event::AutoModerationRuleDelete(Box::new(rule)))
905        }
906        "AUTO_MODERATION_ACTION_EXECUTION" => {
907            let action: AutoModActionExecution = titanium_model::json::from_borrowed_value(data)?;
908            Ok(Event::AutoModerationActionExecution(Box::new(action)))
909        }
910
911        // Integration Events
912        "INTEGRATION_CREATE" => {
913            let integration: Integration = titanium_model::json::from_borrowed_value(data)?;
914            Ok(Event::IntegrationCreate(Box::new(integration)))
915        }
916        "INTEGRATION_UPDATE" => {
917            let integration: Integration = titanium_model::json::from_borrowed_value(data)?;
918            Ok(Event::IntegrationUpdate(Box::new(integration)))
919        }
920        "INTEGRATION_DELETE" => {
921            let integration: IntegrationDeleteEvent = titanium_model::json::from_borrowed_value(data)?;
922            Ok(Event::IntegrationDelete(Box::new(integration)))
923        }
924
925        // Webhook Events
926        "WEBHOOKS_UPDATE" => {
927            let webhooks: WebhooksUpdateEvent = titanium_model::json::from_borrowed_value(data)?;
928            Ok(Event::WebhooksUpdate(Box::new(webhooks)))
929        }
930
931        // Monetization Events
932        "ENTITLEMENT_CREATE" => {
933            let entitlement: Entitlement = titanium_model::json::from_borrowed_value(data)?;
934            Ok(Event::EntitlementCreate(Box::new(entitlement)))
935        }
936        "ENTITLEMENT_UPDATE" => {
937            let entitlement: Entitlement = titanium_model::json::from_borrowed_value(data)?;
938            Ok(Event::EntitlementUpdate(Box::new(entitlement)))
939        }
940        "ENTITLEMENT_DELETE" => {
941            let entitlement: Entitlement = titanium_model::json::from_borrowed_value(data)?;
942            Ok(Event::EntitlementDelete(Box::new(entitlement)))
943        }
944        "SUBSCRIPTION_CREATE" => {
945            let subscription: Subscription = titanium_model::json::from_borrowed_value(data)?;
946            Ok(Event::SubscriptionCreate(Box::new(subscription)))
947        }
948        "SUBSCRIPTION_UPDATE" => {
949            let subscription: Subscription = titanium_model::json::from_borrowed_value(data)?;
950            Ok(Event::SubscriptionUpdate(Box::new(subscription)))
951        }
952        "SUBSCRIPTION_DELETE" => {
953            let subscription: Subscription = titanium_model::json::from_borrowed_value(data)?;
954            Ok(Event::SubscriptionDelete(Box::new(subscription)))
955        }
956
957        // Soundboard Events
958        "SOUNDBOARD_SOUND_CREATE" => {
959            let sound: SoundboardSound = titanium_model::json::from_borrowed_value(data)?;
960            Ok(Event::SoundboardSoundCreate(Box::new(sound)))
961        }
962        "SOUNDBOARD_SOUND_UPDATE" => {
963            let sound: SoundboardSound = titanium_model::json::from_borrowed_value(data)?;
964            Ok(Event::SoundboardSoundUpdate(Box::new(sound)))
965        }
966        "SOUNDBOARD_SOUND_DELETE" => {
967            let sound: SoundboardSoundDeleteEvent = titanium_model::json::from_borrowed_value(data)?;
968            Ok(Event::SoundboardSoundDelete(Box::new(sound)))
969        }
970        "SOUNDBOARD_SOUNDS_UPDATE" => {
971            let sounds: SoundboardSoundsUpdateEvent = titanium_model::json::from_borrowed_value(data)?;
972            Ok(Event::SoundboardSoundsUpdate(Box::new(sounds)))
973        }
974        "GUILD_SOUNDBOARD_SOUNDS_UPDATE" => {
975            let sounds: GuildSoundboardSoundsUpdateEvent =
976                titanium_model::json::from_borrowed_value(data)?;
977            Ok(Event::GuildSoundboardSoundsUpdate(Box::new(sounds)))
978        }
979
980        // Presence & Typing Events
981        "TYPING_START" => {
982            let typing: TypingStartEvent = titanium_model::json::from_borrowed_value(data)?;
983            Ok(Event::TypingStart(Box::new(typing)))
984        }
985        "PRESENCE_UPDATE" => {
986            let presence: PresenceUpdateEvent = titanium_model::json::from_borrowed_value(data)?;
987            Ok(Event::PresenceUpdate(Box::new(presence)))
988        }
989        "USER_UPDATE" => {
990            let user: User = titanium_model::json::from_borrowed_value(data)?;
991            Ok(Event::UserUpdate(Box::new(user)))
992        }
993
994        // Voice Events
995        "VOICE_STATE_UPDATE" => {
996            let voice_state: VoiceStateUpdateEvent = titanium_model::json::from_borrowed_value(data)?;
997            Ok(Event::VoiceStateUpdate(Box::new(voice_state)))
998        }
999        "VOICE_SERVER_UPDATE" => {
1000            let voice_server: VoiceServerUpdateEvent =
1001                titanium_model::json::from_borrowed_value(data)?;
1002            Ok(Event::VoiceServerUpdate(voice_server))
1003        }
1004        "VOICE_CHANNEL_EFFECT_SEND" => {
1005            let effect: VoiceChannelEffectSendEvent = titanium_model::json::from_borrowed_value(data)?;
1006            Ok(Event::VoiceChannelEffectSend(Box::new(effect)))
1007        }
1008
1009        // Unknown event
1010        _ => Ok(Event::Unknown {
1011            name: event_name.to_owned(),
1012            data: data.into(),
1013        }),
1014    }
1015}
1016
1017#[cfg(test)]
1018mod tests {
1019    use super::*;
1020
1021    #[test]
1022    fn test_parse_ready_event() {
1023        let json = r#"{
1024            "v": 10,
1025            "user": {"id": "123", "username": "test", "discriminator": "0001"},
1026            "guilds": [],
1027            "session_id": "abc123",
1028            "resume_gateway_url": "wss://gateway.discord.gg"
1029        }"#;
1030
1031        let ready: ReadyEventData = serde_json::from_str(json).unwrap();
1032        assert_eq!(ready.v, 10);
1033        assert_eq!(ready.session_id, "abc123");
1034    }
1035
1036    #[test]
1037    fn test_parse_message_delete() {
1038        let json = r#"{"id": "123", "channel_id": "456", "guild_id": "789"}"#;
1039        let event: MessageDeleteEvent = serde_json::from_str(json).unwrap();
1040        assert_eq!(event.id.get(), 123);
1041        assert_eq!(event.channel_id.get(), 456);
1042    }
1043
1044    #[test]
1045    fn test_interaction_parse() {
1046        let json = r#"{
1047            "id": "123",
1048            "application_id": "456",
1049            "type": 2,
1050            "token": "abc",
1051            "version": 1
1052        }"#;
1053
1054        let interaction: Interaction = serde_json::from_str(json).unwrap();
1055        assert_eq!(
1056            interaction.interaction_type,
1057            InteractionType::ApplicationCommand
1058        );
1059    }
1060}