1use super::change_key::AuditLogChangeKey;
2use crate::{
3 application::command::permissions::GuildCommandPermissions,
4 channel::{
5 message::sticker::StickerFormatType, permission_overwrite::PermissionOverwrite,
6 stage_instance::PrivacyLevel, thread::AutoArchiveDuration,
7 },
8 guild::{
9 DefaultMessageNotificationLevel, ExplicitContentFilter, MfaLevel, NSFWLevel, Permissions,
10 VerificationLevel,
11 },
12 id::{
13 marker::{
14 ApplicationMarker, ChannelMarker, GenericMarker, GuildMarker, RoleMarker, UserMarker,
15 },
16 Id,
17 },
18 util::{ImageHash, Timestamp},
19};
20use serde::{Deserialize, Serialize};
21
22#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
31pub struct AffectedRole {
32 pub id: Id<RoleMarker>,
34 pub name: String,
36}
37
38#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
40#[serde(untagged)]
41pub enum AuditLogChangeTypeValue {
42 Unsigned(u64),
44 String(String),
46}
47
48#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
52#[non_exhaustive]
53#[serde(rename_all = "snake_case", tag = "key")]
54pub enum AuditLogChange {
55 AfkChannelId {
57 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
59 new: Option<Id<ChannelMarker>>,
60 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
62 old: Option<Id<ChannelMarker>>,
63 },
64 AfkTimeout {
66 #[serde(rename = "new_value")]
68 new: u64,
69 #[serde(rename = "old_value")]
71 old: u64,
72 },
73 Allow {
75 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
77 new: Option<Permissions>,
78 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
80 old: Option<Permissions>,
81 },
82 ApplicationId {
84 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
86 new: Option<Id<ApplicationMarker>>,
87 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
88 old: Option<Id<ApplicationMarker>>,
89 },
90 Archived {
92 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
94 new: Option<bool>,
95 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
97 old: Option<bool>,
98 },
99 Asset {
101 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
103 new: Option<String>,
104 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
106 old: Option<String>,
107 },
108 AutoArchiveDuration {
110 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
112 new: Option<AutoArchiveDuration>,
113 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
115 old: Option<AutoArchiveDuration>,
116 },
117 Available {
119 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
121 new: Option<bool>,
122 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
124 old: Option<bool>,
125 },
126 AvatarHash {
128 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
130 new: Option<ImageHash>,
131 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
133 old: Option<ImageHash>,
134 },
135 BannerHash {
137 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
139 new: Option<ImageHash>,
140 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
142 old: Option<ImageHash>,
143 },
144 Bitrate {
146 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
148 new: Option<u64>,
149 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
151 old: Option<u64>,
152 },
153 ChannelId {
155 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
157 new: Option<Id<ChannelMarker>>,
158 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
160 old: Option<Id<ChannelMarker>>,
161 },
162 Code {
164 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
166 new: Option<String>,
167 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
169 old: Option<String>,
170 },
171 Color {
173 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
175 new: Option<u64>,
176 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
178 old: Option<u64>,
179 },
180 CommandId {
182 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
184 new: Option<GuildCommandPermissions>,
185 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
187 old: Option<GuildCommandPermissions>,
188 },
189 CommunicationDisabledUntil {
191 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
193 new: Option<Timestamp>,
194 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
196 old: Option<Timestamp>,
197 },
198 Deaf {
200 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
202 new: Option<bool>,
203 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
205 old: Option<bool>,
206 },
207 DefaultAutoArchiveDuration {
209 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
211 new: Option<AutoArchiveDuration>,
212 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
214 old: Option<AutoArchiveDuration>,
215 },
216 DefaultMessageNotifications {
218 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
220 new: Option<DefaultMessageNotificationLevel>,
221 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
223 old: Option<DefaultMessageNotificationLevel>,
224 },
225 Deny {
227 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
229 new: Option<Permissions>,
230 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
232 old: Option<Permissions>,
233 },
234 Description {
236 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
238 new: Option<String>,
239 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
241 old: Option<String>,
242 },
243 DiscoverySplashHash {
245 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
247 new: Option<ImageHash>,
248 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
250 old: Option<ImageHash>,
251 },
252 EnableEmoticons {
254 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
256 new: Option<bool>,
257 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
259 old: Option<bool>,
260 },
261 EntityType {
263 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
265 new: Option<u64>,
266 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
268 old: Option<u64>,
269 },
270 ExpireBehavior {
272 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
274 new: Option<u64>,
275 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
277 old: Option<u64>,
278 },
279 ExpireGracePeriod {
281 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
283 new: Option<u64>,
284 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
286 old: Option<u64>,
287 },
288 ExplicitContentFilter {
290 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
292 new: Option<ExplicitContentFilter>,
293 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
295 old: Option<ExplicitContentFilter>,
296 },
297 FormatType {
299 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
301 new: Option<StickerFormatType>,
302 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
304 old: Option<StickerFormatType>,
305 },
306 GuildId {
308 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
310 new: Option<Id<GuildMarker>>,
311 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
313 old: Option<Id<GuildMarker>>,
314 },
315 Hoist {
317 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
319 new: Option<bool>,
320 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
322 old: Option<bool>,
323 },
324 IconHash {
326 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
328 new: Option<ImageHash>,
329 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
331 old: Option<ImageHash>,
332 },
333 Id {
335 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
337 new: Option<Id<GenericMarker>>,
338 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
339 old: Option<Id<GenericMarker>>,
340 },
341 ImageHash {
343 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
345 new: Option<ImageHash>,
346 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
348 old: Option<ImageHash>,
349 },
350 Invitable {
352 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
354 new: Option<bool>,
355 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
357 old: Option<bool>,
358 },
359 InviterId {
361 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
363 new: Option<Id<UserMarker>>,
364 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
365 old: Option<Id<UserMarker>>,
366 },
367 Location {
371 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
372 new: Option<String>,
373 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
374 old: Option<String>,
375 },
376 Locked {
378 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
380 new: Option<bool>,
381 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
383 old: Option<bool>,
384 },
385 MaxAge {
387 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
389 new: Option<u64>,
390 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
392 old: Option<u64>,
393 },
394 MaxUses {
396 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
398 new: Option<u64>,
399 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
401 old: Option<u64>,
402 },
403 Mentionable {
405 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
407 new: Option<bool>,
408 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
410 old: Option<bool>,
411 },
412 MfaLevel {
414 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
416 new: Option<MfaLevel>,
417 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
419 old: Option<MfaLevel>,
420 },
421 Mute {
423 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
425 new: Option<bool>,
426 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
428 old: Option<bool>,
429 },
430 Name {
432 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
434 new: Option<String>,
435 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
437 old: Option<String>,
438 },
439 Nick {
441 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
443 new: Option<String>,
444 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
446 old: Option<String>,
447 },
448 Nsfw {
450 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
452 new: Option<bool>,
453 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
455 old: Option<bool>,
456 },
457 NsfwLevel {
459 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
461 new: Option<NSFWLevel>,
462 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
464 old: Option<NSFWLevel>,
465 },
466 OwnerId {
468 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
470 new: Option<Id<UserMarker>>,
471 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
473 old: Option<Id<UserMarker>>,
474 },
475 PermissionOverwrites {
477 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
479 new: Option<Vec<PermissionOverwrite>>,
480 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
482 old: Option<Vec<PermissionOverwrite>>,
483 },
484 Permissions {
486 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
488 new: Option<Permissions>,
489 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
491 old: Option<Permissions>,
492 },
493 Position {
495 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
497 new: Option<u64>,
498 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
500 old: Option<u64>,
501 },
502 PreferredLocale {
504 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
506 new: Option<String>,
507 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
509 old: Option<String>,
510 },
511 PrivacyLevel {
513 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
515 new: Option<PrivacyLevel>,
516 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
518 old: Option<PrivacyLevel>,
519 },
520 PruneDeleteDays {
522 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
524 new: Option<u64>,
525 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
526 old: Option<u64>,
527 },
528 PublicUpdatesChannelId {
530 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
532 new: Option<Id<ChannelMarker>>,
533 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
535 old: Option<Id<ChannelMarker>>,
536 },
537 RateLimitPerUser {
539 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
541 new: Option<u64>,
542 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
544 old: Option<u64>,
545 },
546 Region {
548 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
550 new: Option<String>,
551 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
553 old: Option<String>,
554 },
555 #[serde(rename = "$add")]
557 RoleAdded {
558 #[serde(default, rename = "new_value", skip_serializing_if = "Vec::is_empty")]
560 new: Vec<AffectedRole>,
561 #[serde(default, rename = "old_value", skip_serializing_if = "Vec::is_empty")]
563 old: Vec<AffectedRole>,
564 },
565 #[serde(rename = "$remove")]
567 RoleRemoved {
568 #[serde(default, rename = "new_value", skip_serializing_if = "Vec::is_empty")]
570 new: Vec<AffectedRole>,
571 #[serde(default, rename = "old_value", skip_serializing_if = "Vec::is_empty")]
573 old: Vec<AffectedRole>,
574 },
575 RulesChannelId {
577 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
579 new: Option<Id<ChannelMarker>>,
580 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
582 old: Option<Id<ChannelMarker>>,
583 },
584 SplashHash {
586 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
588 new: Option<ImageHash>,
589 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
591 old: Option<ImageHash>,
592 },
593 Status {
595 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
597 new: Option<u64>,
598 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
600 old: Option<u64>,
601 },
602 SystemChannelId {
604 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
606 new: Option<Id<ChannelMarker>>,
607 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
609 old: Option<Id<ChannelMarker>>,
610 },
611 Tags {
613 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
615 new: Option<String>,
616 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
618 old: Option<String>,
619 },
620 Temporary {
622 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
624 new: Option<bool>,
625 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
627 old: Option<bool>,
628 },
629 Topic {
631 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
633 new: Option<String>,
634 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
636 old: Option<String>,
637 },
638 Type {
643 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
645 new: Option<AuditLogChangeTypeValue>,
646 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
648 old: Option<AuditLogChangeTypeValue>,
649 },
650 UnicodeEmoji {
652 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
654 new: Option<String>,
655 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
657 old: Option<String>,
658 },
659 UserLimit {
661 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
663 new: Option<u64>,
664 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
666 old: Option<u64>,
667 },
668 Uses {
670 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
672 new: Option<u64>,
673 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
675 old: Option<u64>,
676 },
677 VanityUrlCode {
679 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
681 new: Option<String>,
682 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
684 old: Option<String>,
685 },
686 VerificationLevel {
688 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
690 new: Option<VerificationLevel>,
691 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
693 old: Option<VerificationLevel>,
694 },
695 WidgetChannelId {
697 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
699 new: Option<Id<ChannelMarker>>,
700 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
702 old: Option<Id<ChannelMarker>>,
703 },
704 WidgetEnabled {
706 #[serde(rename = "new_value", skip_serializing_if = "Option::is_none")]
708 new: Option<bool>,
709 #[serde(rename = "old_value", skip_serializing_if = "Option::is_none")]
711 old: Option<bool>,
712 },
713 #[serde(other)]
715 Other,
716}
717
718impl AuditLogChange {
719 pub const fn key(&self) -> Option<AuditLogChangeKey> {
741 Some(match self {
742 Self::AfkChannelId { .. } => AuditLogChangeKey::AfkChannelId,
743 Self::AfkTimeout { .. } => AuditLogChangeKey::AfkTimeout,
744 Self::Allow { .. } => AuditLogChangeKey::Allow,
745 Self::ApplicationId { .. } => AuditLogChangeKey::ApplicationId,
746 Self::Archived { .. } => AuditLogChangeKey::Archived,
747 Self::Asset { .. } => AuditLogChangeKey::Asset,
748 Self::AutoArchiveDuration { .. } => AuditLogChangeKey::AutoArchiveDuration,
749 Self::Available { .. } => AuditLogChangeKey::Available,
750 Self::AvatarHash { .. } => AuditLogChangeKey::AvatarHash,
751 Self::BannerHash { .. } => AuditLogChangeKey::BannerHash,
752 Self::Bitrate { .. } => AuditLogChangeKey::Bitrate,
753 Self::ChannelId { .. } => AuditLogChangeKey::ChannelId,
754 Self::Code { .. } => AuditLogChangeKey::Code,
755 Self::Color { .. } => AuditLogChangeKey::Color,
756 Self::CommandId { .. } => AuditLogChangeKey::CommandId,
757 Self::CommunicationDisabledUntil { .. } => {
758 AuditLogChangeKey::CommunicationDisabledUntil
759 }
760 Self::Deaf { .. } => AuditLogChangeKey::Deaf,
761 Self::DefaultAutoArchiveDuration { .. } => {
762 AuditLogChangeKey::DefaultAutoArchiveDuration
763 }
764 Self::DefaultMessageNotifications { .. } => {
765 AuditLogChangeKey::DefaultMessageNotifications
766 }
767 Self::Deny { .. } => AuditLogChangeKey::Deny,
768 Self::Description { .. } => AuditLogChangeKey::Description,
769 Self::DiscoverySplashHash { .. } => AuditLogChangeKey::DiscoverySplashHash,
770 Self::EnableEmoticons { .. } => AuditLogChangeKey::EnableEmoticons,
771 Self::EntityType { .. } => AuditLogChangeKey::EntityType,
772 Self::ExpireBehavior { .. } => AuditLogChangeKey::ExpireBehavior,
773 Self::ExpireGracePeriod { .. } => AuditLogChangeKey::ExpireGracePeriod,
774 Self::ExplicitContentFilter { .. } => AuditLogChangeKey::ExplicitContentFilter,
775 Self::FormatType { .. } => AuditLogChangeKey::FormatType,
776 Self::GuildId { .. } => AuditLogChangeKey::GuildId,
777 Self::Hoist { .. } => AuditLogChangeKey::Hoist,
778 Self::IconHash { .. } => AuditLogChangeKey::IconHash,
779 Self::Id { .. } => AuditLogChangeKey::Id,
780 Self::ImageHash { .. } => AuditLogChangeKey::ImageHash,
781 Self::Invitable { .. } => AuditLogChangeKey::Invitable,
782 Self::InviterId { .. } => AuditLogChangeKey::InviterId,
783 Self::Location { .. } => AuditLogChangeKey::Location,
784 Self::Locked { .. } => AuditLogChangeKey::Locked,
785 Self::MaxAge { .. } => AuditLogChangeKey::MaxAge,
786 Self::MaxUses { .. } => AuditLogChangeKey::MaxUses,
787 Self::Mentionable { .. } => AuditLogChangeKey::Mentionable,
788 Self::MfaLevel { .. } => AuditLogChangeKey::MfaLevel,
789 Self::Mute { .. } => AuditLogChangeKey::Mute,
790 Self::Name { .. } => AuditLogChangeKey::Name,
791 Self::Nick { .. } => AuditLogChangeKey::Nick,
792 Self::Nsfw { .. } => AuditLogChangeKey::Nsfw,
793 Self::NsfwLevel { .. } => AuditLogChangeKey::NsfwLevel,
794 Self::OwnerId { .. } => AuditLogChangeKey::OwnerId,
795 Self::PermissionOverwrites { .. } => AuditLogChangeKey::PermissionOverwrites,
796 Self::Permissions { .. } => AuditLogChangeKey::Permissions,
797 Self::Position { .. } => AuditLogChangeKey::Position,
798 Self::PreferredLocale { .. } => AuditLogChangeKey::PreferredLocale,
799 Self::PrivacyLevel { .. } => AuditLogChangeKey::PrivacyLevel,
800 Self::PruneDeleteDays { .. } => AuditLogChangeKey::PruneDeleteDays,
801 Self::PublicUpdatesChannelId { .. } => AuditLogChangeKey::PublicUpdatesChannelId,
802 Self::RateLimitPerUser { .. } => AuditLogChangeKey::RateLimitPerUser,
803 Self::Region { .. } => AuditLogChangeKey::Region,
804 Self::RoleAdded { .. } => AuditLogChangeKey::RoleAdded,
805 Self::RoleRemoved { .. } => AuditLogChangeKey::RoleRemoved,
806 Self::RulesChannelId { .. } => AuditLogChangeKey::RulesChannelId,
807 Self::SplashHash { .. } => AuditLogChangeKey::SplashHash,
808 Self::Status { .. } => AuditLogChangeKey::Status,
809 Self::SystemChannelId { .. } => AuditLogChangeKey::SystemChannelId,
810 Self::Tags { .. } => AuditLogChangeKey::Tags,
811 Self::Temporary { .. } => AuditLogChangeKey::Temporary,
812 Self::Topic { .. } => AuditLogChangeKey::Topic,
813 Self::Type { .. } => AuditLogChangeKey::Type,
814 Self::UnicodeEmoji { .. } => AuditLogChangeKey::UnicodeEmoji,
815 Self::UserLimit { .. } => AuditLogChangeKey::UserLimit,
816 Self::Uses { .. } => AuditLogChangeKey::Uses,
817 Self::VanityUrlCode { .. } => AuditLogChangeKey::VanityUrlCode,
818 Self::VerificationLevel { .. } => AuditLogChangeKey::VerificationLevel,
819 Self::WidgetChannelId { .. } => AuditLogChangeKey::WidgetChannelId,
820 Self::WidgetEnabled { .. } => AuditLogChangeKey::WidgetEnabled,
821 Self::Other => return None,
822 })
823 }
824}
825
826#[cfg(test)]
827mod tests {
828 use super::{super::AuditLogChangeKey, AffectedRole, AuditLogChange, AuditLogChangeTypeValue};
829 use crate::{channel::ChannelType, guild::Permissions, id::Id};
830 use serde::{Deserialize, Serialize};
831 use serde_test::Token;
832 use static_assertions::{assert_fields, assert_impl_all};
833 use std::{fmt::Debug, hash::Hash};
834
835 assert_fields!(AffectedRole: id, name);
836 assert_fields!(AuditLogChange::AfkChannelId: new, old);
837 assert_fields!(AuditLogChange::AfkTimeout: new, old);
838 assert_fields!(AuditLogChange::Allow: new);
839 assert_fields!(AuditLogChange::ApplicationId: new);
840 assert_fields!(AuditLogChange::AvatarHash: new, old);
841 assert_fields!(AuditLogChange::BannerHash: new, old);
842 assert_fields!(AuditLogChange::Bitrate: new, old);
843 assert_fields!(AuditLogChange::ChannelId: new);
844 assert_fields!(AuditLogChange::Code: new);
845 assert_fields!(AuditLogChange::Color: new, old);
846 assert_fields!(AuditLogChange::CommandId: new, old);
847 assert_fields!(AuditLogChange::CommunicationDisabledUntil: new, old);
848 assert_fields!(AuditLogChange::Deaf: new, old);
849 assert_fields!(AuditLogChange::DefaultMessageNotifications: new, old);
850 assert_fields!(AuditLogChange::Deny: new);
851 assert_fields!(AuditLogChange::Description: new, old);
852 assert_fields!(AuditLogChange::DiscoverySplashHash: new, old);
853 assert_fields!(AuditLogChange::EnableEmoticons: new, old);
854 assert_fields!(AuditLogChange::ExpireBehavior: new);
855 assert_fields!(AuditLogChange::ExpireGracePeriod: new);
856 assert_fields!(AuditLogChange::ExplicitContentFilter: new, old);
857 assert_fields!(AuditLogChange::Hoist: new, old);
858 assert_fields!(AuditLogChange::IconHash: new, old);
859 assert_fields!(AuditLogChange::Id: new);
860 assert_fields!(AuditLogChange::ImageHash: new, old);
861 assert_fields!(AuditLogChange::Invitable: new, old);
862 assert_fields!(AuditLogChange::InviterId: new);
863 assert_fields!(AuditLogChange::MaxAge: new);
864 assert_fields!(AuditLogChange::MaxUses: new);
865 assert_fields!(AuditLogChange::Mentionable: new, old);
866 assert_fields!(AuditLogChange::MfaLevel: new, old);
867 assert_fields!(AuditLogChange::Mute: new, old);
868 assert_fields!(AuditLogChange::Name: new, old);
869 assert_fields!(AuditLogChange::Nick: new, old);
870 assert_fields!(AuditLogChange::NsfwLevel: new, old);
871 assert_fields!(AuditLogChange::OwnerId: new, old);
872 assert_fields!(AuditLogChange::Permissions: new, old);
873 assert_fields!(AuditLogChange::PrivacyLevel: new, old);
874 assert_fields!(AuditLogChange::Position: new, old);
875 assert_fields!(AuditLogChange::PreferredLocale: new, old);
876 assert_fields!(AuditLogChange::PruneDeleteDays: new);
877 assert_fields!(AuditLogChange::PublicUpdatesChannelId: new, old);
878 assert_fields!(AuditLogChange::RateLimitPerUser: new, old);
879 assert_fields!(AuditLogChange::RoleAdded: new);
880 assert_fields!(AuditLogChange::RoleRemoved: new);
881 assert_fields!(AuditLogChange::RulesChannelId: new, old);
882 assert_fields!(AuditLogChange::SplashHash: new, old);
883 assert_fields!(AuditLogChange::SystemChannelId: new, old);
884 assert_fields!(AuditLogChange::Temporary: new);
885 assert_fields!(AuditLogChange::Topic: new);
886 assert_fields!(AuditLogChange::Type: new);
887 assert_fields!(AuditLogChange::Uses: new);
888 assert_fields!(AuditLogChange::UserLimit: new, old);
889 assert_fields!(AuditLogChange::VanityUrlCode: new, old);
890 assert_fields!(AuditLogChange::VerificationLevel: new, old);
891 assert_fields!(AuditLogChange::WidgetChannelId: new, old);
892 assert_fields!(AuditLogChange::WidgetEnabled: new, old);
893 assert_impl_all!(
894 AffectedRole: Clone,
895 Debug,
896 Deserialize<'static>,
897 Eq,
898 Hash,
899 PartialEq,
900 Send,
901 Serialize,
902 Sync
903 );
904 assert_impl_all!(
905 AuditLogChange: Clone,
906 Debug,
907 Deserialize<'static>,
908 Eq,
909 Hash,
910 PartialEq,
911 Send,
912 Serialize,
913 Sync
914 );
915 assert_impl_all!(
916 AuditLogChangeTypeValue: Clone,
917 Debug,
918 Deserialize<'static>,
919 Eq,
920 Hash,
921 PartialEq,
922 Send,
923 Serialize,
924 Sync
925 );
926
927 #[test]
928 fn afk_channel_id() {
929 let value = AuditLogChange::AfkChannelId {
930 new: Some(Id::new(1)),
931 old: None,
932 };
933
934 assert_eq!(Some(AuditLogChangeKey::AfkChannelId), value.key());
935
936 serde_test::assert_tokens(
937 &value,
938 &[
939 Token::Struct {
940 name: "AuditLogChange",
941 len: 2,
942 },
943 Token::String("key"),
944 Token::String("afk_channel_id"),
945 Token::String("new_value"),
946 Token::Some,
947 Token::NewtypeStruct { name: "Id" },
948 Token::String("1"),
949 Token::StructEnd,
950 ],
951 );
952 }
953
954 #[test]
955 fn permissions() {
956 let old: Permissions = Permissions::SEND_MESSAGES;
957 let new: Permissions = old | Permissions::EMBED_LINKS;
958
959 let value = AuditLogChange::Permissions {
960 new: Some(new),
961 old: Some(old),
962 };
963
964 assert_eq!(Some(AuditLogChangeKey::Permissions), value.key());
965
966 serde_test::assert_tokens(
967 &value,
968 &[
969 Token::Struct {
970 name: "AuditLogChange",
971 len: 3,
972 },
973 Token::String("key"),
974 Token::String("permissions"),
975 Token::String("new_value"),
976 Token::Some,
977 Token::Str("18432"),
978 Token::String("old_value"),
979 Token::Some,
980 Token::Str("2048"),
981 Token::StructEnd,
982 ],
983 );
984 }
985
986 #[test]
987 fn channel_type() {
988 let value = AuditLogChange::Type {
989 new: Some(AuditLogChangeTypeValue::Unsigned(u64::from(u8::from(
990 ChannelType::PrivateThread,
991 )))),
992 old: None,
993 };
994
995 serde_test::assert_tokens(
996 &value,
997 &[
998 Token::Struct {
999 name: "AuditLogChange",
1000 len: 2,
1001 },
1002 Token::String("key"),
1003 Token::Str("type"),
1004 Token::String("new_value"),
1005 Token::Some,
1006 Token::U64(u64::from(u8::from(ChannelType::PrivateThread))),
1007 Token::StructEnd,
1008 ],
1009 );
1010 }
1011
1012 #[test]
1013 fn integration_type() {
1014 let value = AuditLogChange::Type {
1015 new: Some(AuditLogChangeTypeValue::String("discord".to_owned())),
1016 old: None,
1017 };
1018
1019 serde_test::assert_tokens(
1020 &value,
1021 &[
1022 Token::Struct {
1023 name: "AuditLogChange",
1024 len: 2,
1025 },
1026 Token::String("key"),
1027 Token::Str("type"),
1028 Token::String("new_value"),
1029 Token::Some,
1030 Token::Str("discord"),
1031 Token::StructEnd,
1032 ],
1033 );
1034 }
1035}