1use crate::error::GatewayError;
20use titanium_model::voice::{
21 VoiceChannelEffectSendEvent, VoiceServerUpdateEvent, VoiceStateUpdateEvent,
22};
23pub use titanium_model::*;
24
25#[derive(Debug, Clone)]
30#[non_exhaustive]
31pub enum Event<'a> {
32 Ready(Box<ReadyEventData<'a>>),
37
38 Resumed,
40
41 GuildCreate(Box<Guild<'a>>),
46
47 GuildUpdate(Box<Guild<'a>>),
49
50 GuildDelete(UnavailableGuild),
52
53 GuildBanAdd(Box<GuildBanEvent<'a>>),
55
56 GuildBanRemove(Box<GuildBanEvent<'a>>),
58
59 GuildEmojisUpdate(Box<GuildEmojisUpdateEvent<'a>>),
61
62 GuildStickersUpdate(Box<GuildStickersUpdateEvent<'a>>),
64
65 GuildIntegrationsUpdate(Box<GuildIntegrationsUpdateEvent>),
67
68 GuildAuditLogEntryCreate(Box<AuditLogEntry>),
70
71 GuildMemberAdd(Box<GuildMemberAddEvent<'a>>),
76
77 GuildMemberRemove(Box<GuildMemberRemoveEvent<'a>>),
79
80 GuildMemberUpdate(Box<GuildMemberUpdateEvent<'a>>),
82
83 GuildMembersChunk(Box<GuildMembersChunkEvent<'a>>),
85
86 GuildRoleCreate(Box<GuildRoleEvent<'a>>),
91
92 GuildRoleUpdate(Box<GuildRoleEvent<'a>>),
94
95 GuildRoleDelete(Box<GuildRoleDeleteEvent>),
97
98 ChannelCreate(Box<Channel<'a>>),
103
104 ChannelUpdate(Box<Channel<'a>>),
106
107 ChannelDelete(Box<Channel<'a>>),
109
110 ChannelPinsUpdate(Box<ChannelPinsUpdateEvent>),
112
113 ThreadCreate(Box<Channel<'a>>),
118
119 ThreadUpdate(Box<Channel<'a>>),
121
122 ThreadDelete(Box<ThreadDeleteEvent>),
124
125 ThreadListSync(Box<ThreadListSyncEvent<'a>>),
127
128 ThreadMemberUpdate(Box<ThreadMemberUpdateEvent<'a>>),
130
131 ThreadMembersUpdate(Box<ThreadMembersUpdateEvent<'a>>),
133
134 MessageCreate(Box<Message<'a>>),
139
140 MessageUpdate(Box<MessageUpdateEvent<'a>>),
142
143 MessageDelete(MessageDeleteEvent),
145
146 MessageDeleteBulk(MessageDeleteBulkEvent),
148
149 MessageReactionAdd(Box<MessageReactionAddEvent<'a>>),
154
155 MessageReactionRemove(Box<MessageReactionRemoveEvent<'a>>),
157
158 MessageReactionRemoveAll(Box<MessageReactionRemoveAllEvent>),
160
161 MessageReactionRemoveEmoji(Box<MessageReactionRemoveEmojiEvent<'a>>),
163
164 InteractionCreate(Box<Interaction<'a>>),
169
170 InviteCreate(Box<InviteCreateEvent<'a>>),
175
176 InviteDelete(Box<InviteDeleteEvent<'a>>),
178
179 StageInstanceCreate(Box<StageInstance>),
184
185 StageInstanceUpdate(Box<StageInstance>),
187
188 StageInstanceDelete(Box<StageInstance>),
190
191 GuildScheduledEventCreate(Box<ScheduledEvent<'a>>),
196
197 GuildScheduledEventUpdate(Box<ScheduledEvent<'a>>),
199
200 GuildScheduledEventDelete(Box<ScheduledEvent<'a>>),
202
203 GuildScheduledEventUserAdd(Box<ScheduledEventUserEvent>),
205
206 GuildScheduledEventUserRemove(Box<ScheduledEventUserEvent>),
208
209 AutoModerationRuleCreate(Box<AutoModRule>),
214
215 AutoModerationRuleUpdate(Box<AutoModRule>),
217
218 AutoModerationRuleDelete(Box<AutoModRule>),
220
221 AutoModerationActionExecution(Box<AutoModActionExecution>),
223
224 IntegrationCreate(Box<Integration<'a>>),
229
230 IntegrationUpdate(Box<Integration<'a>>),
232
233 IntegrationDelete(Box<IntegrationDeleteEvent>),
235
236 WebhooksUpdate(Box<WebhooksUpdateEvent>),
241
242 EntitlementCreate(Box<Entitlement>),
247
248 EntitlementUpdate(Box<Entitlement>),
250
251 EntitlementDelete(Box<Entitlement>),
253
254 SubscriptionCreate(Box<Subscription>),
256
257 SubscriptionUpdate(Box<Subscription>),
259
260 SubscriptionDelete(Box<Subscription>),
262
263 SoundboardSoundCreate(Box<SoundboardSound<'a>>),
268
269 SoundboardSoundUpdate(Box<SoundboardSound<'a>>),
271
272 SoundboardSoundDelete(Box<SoundboardSoundDeleteEvent>),
274
275 SoundboardSoundsUpdate(Box<SoundboardSoundsUpdateEvent<'a>>),
277
278 GuildSoundboardSoundsUpdate(Box<GuildSoundboardSoundsUpdateEvent<'a>>),
280
281 TypingStart(Box<TypingStartEvent<'a>>),
286
287 PresenceUpdate(Box<PresenceUpdateEvent>),
289
290 UserUpdate(Box<User<'a>>),
292
293 VoiceStateUpdate(Box<VoiceStateUpdateEvent<'a>>),
298
299 VoiceServerUpdate(VoiceServerUpdateEvent),
301
302 VoiceChannelEffectSend(Box<VoiceChannelEffectSendEvent<'a>>),
304
305 Unknown {
310 name: String,
312 data: titanium_model::json::Value,
314 },
315}
316
317#[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 "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_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_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 "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_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_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_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 "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_CREATE" => {
498 let interaction: Interaction = serde_json::from_str(json_str)?;
499 Ok(Event::InteractionCreate(Box::new(interaction)))
500 }
501
502 "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_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 "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 "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_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 "WEBHOOKS_UPDATE" => {
582 let webhooks: WebhooksUpdateEvent = serde_json::from_str(json_str)?;
583 Ok(Event::WebhooksUpdate(Box::new(webhooks)))
584 }
585
586 "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_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 "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_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 _ => {
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#[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 "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_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_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 "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_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_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_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 "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_CREATE" => {
843 let interaction: Interaction = titanium_model::json::from_borrowed_value(data)?;
844 Ok(Event::InteractionCreate(Box::new(interaction)))
845 }
846
847 "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_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 "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 "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_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 "WEBHOOKS_UPDATE" => {
927 let webhooks: WebhooksUpdateEvent = titanium_model::json::from_borrowed_value(data)?;
928 Ok(Event::WebhooksUpdate(Box::new(webhooks)))
929 }
930
931 "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_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 "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_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 _ => 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}