Skip to main content

twilight_http/request/
audit_reason.rs

1/// Attach a reason for a request.
2///
3/// Reasons are associated with the audit log entries that are automatically
4/// created for certain requests.
5pub trait AuditLogReason<'a>: private::Sealed {
6    /// Attach an audit log reason to the request.
7    ///
8    /// # Errors
9    ///
10    /// Returns an error of type [`AuditReason`] if the length is invalid.
11    ///
12    /// [`AuditReason`]: twilight_validate::request::ValidationErrorType::AuditReason
13    #[must_use]
14    fn reason(self, reason: &'a str) -> Self
15    where
16        Self: Sized;
17}
18
19mod private {
20    use crate::request::{
21        channel::{
22            CreatePin, DeleteChannel, DeleteChannelPermissionConfigured, DeletePin,
23            FollowNewsChannel, UpdateChannel, UpdateChannelPermission,
24            invite::{CreateInvite, DeleteInvite},
25            message::{DeleteMessage, DeleteMessages},
26            stage::{CreateStageInstance, DeleteStageInstance, UpdateStageInstance},
27            thread::{
28                CreateForumThread, CreateThread, CreateThreadFromMessage, UpdateThread,
29                create_forum_thread::CreateForumThreadMessage,
30            },
31            webhook::{CreateWebhook, DeleteWebhook, DeleteWebhookMessage, UpdateWebhook},
32        },
33        guild::{
34            CreateGuildChannel, CreateGuildPrune, UpdateCurrentMember, UpdateGuild, UpdateGuildMfa,
35            UpdateGuildWelcomeScreen, UpdateGuildWidgetSettings,
36            auto_moderation::{
37                CreateAutoModerationRule, DeleteAutoModerationRule, UpdateAutoModerationRule,
38            },
39            ban::{CreateBan, DeleteBan},
40            emoji::{CreateEmoji, DeleteEmoji, UpdateEmoji},
41            integration::DeleteGuildIntegration,
42            member::{AddRoleToMember, RemoveMember, RemoveRoleFromMember, UpdateGuildMember},
43            role::{CreateRole, DeleteRole, UpdateRole, UpdateRolePositions},
44            sticker::{CreateGuildSticker, DeleteGuildSticker, UpdateGuildSticker},
45            update_guild_onboarding::UpdateGuildOnboarding,
46        },
47        scheduled_event::{
48            CreateGuildExternalScheduledEvent, CreateGuildScheduledEvent,
49            CreateGuildStageInstanceScheduledEvent, CreateGuildVoiceScheduledEvent,
50            UpdateGuildScheduledEvent,
51        },
52        user::UpdateCurrentUser,
53    };
54
55    /// Sealed stops crates other crates implementing the trait.
56    pub trait Sealed {}
57
58    impl Sealed for AddRoleToMember<'_> {}
59    impl Sealed for CreateAutoModerationRule<'_> {}
60    impl Sealed for CreateBan<'_> {}
61    impl Sealed for CreateEmoji<'_> {}
62    impl Sealed for CreateForumThreadMessage<'_> {}
63    impl Sealed for CreateForumThread<'_> {}
64    impl Sealed for CreateGuildChannel<'_> {}
65    impl Sealed for CreateGuildExternalScheduledEvent<'_> {}
66    impl Sealed for CreateGuildPrune<'_> {}
67    impl Sealed for CreateGuildScheduledEvent<'_> {}
68    impl Sealed for CreateGuildStageInstanceScheduledEvent<'_> {}
69    impl Sealed for CreateGuildSticker<'_> {}
70    impl Sealed for CreateGuildVoiceScheduledEvent<'_> {}
71    impl Sealed for CreateInvite<'_> {}
72    impl Sealed for CreatePin<'_> {}
73    impl Sealed for CreateRole<'_> {}
74    impl Sealed for CreateStageInstance<'_> {}
75    impl Sealed for CreateThread<'_> {}
76    impl Sealed for CreateThreadFromMessage<'_> {}
77    impl Sealed for CreateWebhook<'_> {}
78    impl Sealed for DeleteAutoModerationRule<'_> {}
79    impl Sealed for DeleteBan<'_> {}
80    impl Sealed for DeleteChannel<'_> {}
81    impl Sealed for DeleteChannelPermissionConfigured<'_> {}
82    impl Sealed for DeleteEmoji<'_> {}
83    impl Sealed for DeleteGuildIntegration<'_> {}
84    impl Sealed for DeleteGuildSticker<'_> {}
85    impl Sealed for DeleteInvite<'_> {}
86    impl Sealed for DeleteMessage<'_> {}
87    impl Sealed for DeleteMessages<'_> {}
88    impl Sealed for DeletePin<'_> {}
89    impl Sealed for DeleteRole<'_> {}
90    impl Sealed for DeleteStageInstance<'_> {}
91    impl Sealed for DeleteWebhook<'_> {}
92    impl Sealed for DeleteWebhookMessage<'_> {}
93    impl Sealed for FollowNewsChannel<'_> {}
94    impl Sealed for RemoveMember<'_> {}
95    impl Sealed for RemoveRoleFromMember<'_> {}
96    impl Sealed for UpdateAutoModerationRule<'_> {}
97    impl Sealed for UpdateChannel<'_> {}
98    impl Sealed for UpdateChannelPermission<'_> {}
99    impl Sealed for UpdateCurrentMember<'_> {}
100    impl Sealed for UpdateCurrentUser<'_> {}
101    impl Sealed for UpdateEmoji<'_> {}
102    impl Sealed for UpdateGuild<'_> {}
103    impl Sealed for UpdateGuildMember<'_> {}
104    impl Sealed for UpdateGuildMfa<'_> {}
105    impl Sealed for UpdateGuildOnboarding<'_> {}
106    impl Sealed for UpdateGuildScheduledEvent<'_> {}
107    impl Sealed for UpdateGuildSticker<'_> {}
108    impl Sealed for UpdateGuildWelcomeScreen<'_> {}
109    impl Sealed for UpdateGuildWidgetSettings<'_> {}
110    impl Sealed for UpdateRole<'_> {}
111    impl Sealed for UpdateRolePositions<'_> {}
112    impl Sealed for UpdateStageInstance<'_> {}
113    impl Sealed for UpdateThread<'_> {}
114    impl Sealed for UpdateWebhook<'_> {}
115}
116
117#[cfg(test)]
118mod tests {
119    use super::AuditLogReason;
120    use crate::request::{
121        channel::{
122            CreatePin, DeleteChannel, DeleteChannelPermissionConfigured, DeletePin,
123            FollowNewsChannel, UpdateChannel, UpdateChannelPermission,
124            invite::{CreateInvite, DeleteInvite},
125            message::{DeleteMessage, DeleteMessages},
126            stage::{CreateStageInstance, DeleteStageInstance, UpdateStageInstance},
127            thread::{
128                CreateForumThread, CreateThread, CreateThreadFromMessage,
129                create_forum_thread::CreateForumThreadMessage,
130            },
131            webhook::{CreateWebhook, DeleteWebhook, UpdateWebhook},
132        },
133        guild::{
134            CreateGuildChannel, CreateGuildPrune, UpdateCurrentMember, UpdateGuild,
135            UpdateGuildWelcomeScreen,
136            ban::{CreateBan, DeleteBan},
137            emoji::{CreateEmoji, DeleteEmoji, UpdateEmoji},
138            integration::DeleteGuildIntegration,
139            member::{AddRoleToMember, RemoveMember, RemoveRoleFromMember, UpdateGuildMember},
140            role::{CreateRole, DeleteRole, UpdateRole, UpdateRolePositions},
141            sticker::{CreateGuildSticker, DeleteGuildSticker, UpdateGuildSticker},
142        },
143        user::UpdateCurrentUser,
144    };
145    use static_assertions::{assert_impl_all, assert_obj_safe};
146
147    assert_obj_safe!(AuditLogReason<'_>);
148
149    assert_impl_all!(AddRoleToMember<'_>: AuditLogReason<'static>);
150    assert_impl_all!(CreateBan<'_>: AuditLogReason<'static>);
151    assert_impl_all!(CreateEmoji<'_>: AuditLogReason<'static>);
152    assert_impl_all!(CreateForumThread<'_>: AuditLogReason<'static>);
153    assert_impl_all!(CreateForumThreadMessage<'_>: AuditLogReason<'static>);
154    assert_impl_all!(CreateGuildChannel<'_>: AuditLogReason<'static>);
155    assert_impl_all!(CreateGuildPrune<'_>: AuditLogReason<'static>);
156    assert_impl_all!(CreateGuildSticker<'_>: AuditLogReason<'static>);
157    assert_impl_all!(CreateInvite<'_>: AuditLogReason<'static>);
158    assert_impl_all!(CreatePin<'_>: AuditLogReason<'static>);
159    assert_impl_all!(CreateRole<'_>: AuditLogReason<'static>);
160    assert_impl_all!(CreateStageInstance<'_>: AuditLogReason<'static>);
161    assert_impl_all!(CreateThread<'_>: AuditLogReason<'static>);
162    assert_impl_all!(CreateThreadFromMessage<'_>: AuditLogReason<'static>);
163    assert_impl_all!(CreateWebhook<'_>: AuditLogReason<'static>);
164    assert_impl_all!(DeleteBan<'_>: AuditLogReason<'static>);
165    assert_impl_all!(DeleteChannel<'_>: AuditLogReason<'static>);
166    assert_impl_all!(DeleteChannelPermissionConfigured<'_>: AuditLogReason<'static>);
167    assert_impl_all!(DeleteEmoji<'_>: AuditLogReason<'static>);
168    assert_impl_all!(DeleteGuildIntegration<'_>: AuditLogReason<'static>);
169    assert_impl_all!(DeleteGuildSticker<'_>: AuditLogReason<'static>);
170    assert_impl_all!(DeleteInvite<'_>: AuditLogReason<'static>);
171    assert_impl_all!(DeleteMessage<'_>: AuditLogReason<'static>);
172    assert_impl_all!(DeleteMessages<'_>: AuditLogReason<'static>);
173    assert_impl_all!(DeletePin<'_>: AuditLogReason<'static>);
174    assert_impl_all!(DeleteRole<'_>: AuditLogReason<'static>);
175    assert_impl_all!(DeleteStageInstance<'_>: AuditLogReason<'static>);
176    assert_impl_all!(DeleteWebhook<'_>: AuditLogReason<'static>);
177    assert_impl_all!(FollowNewsChannel<'_>: AuditLogReason<'static>);
178    assert_impl_all!(RemoveMember<'_>: AuditLogReason<'static>);
179    assert_impl_all!(RemoveRoleFromMember<'_>: AuditLogReason<'static>);
180    assert_impl_all!(UpdateChannel<'_>: AuditLogReason<'static>);
181    assert_impl_all!(UpdateChannelPermission<'_>: AuditLogReason<'static>);
182    assert_impl_all!(UpdateCurrentMember<'_>: AuditLogReason<'static>);
183    assert_impl_all!(UpdateCurrentUser<'_>: AuditLogReason<'static>);
184    assert_impl_all!(UpdateEmoji<'_>: AuditLogReason<'static>);
185    assert_impl_all!(UpdateGuild<'_>: AuditLogReason<'static>);
186    assert_impl_all!(UpdateGuildMember<'_>: AuditLogReason<'static>);
187    assert_impl_all!(UpdateGuildSticker<'_>: AuditLogReason<'static>);
188    assert_impl_all!(UpdateGuildWelcomeScreen<'_>: AuditLogReason<'static>);
189    assert_impl_all!(UpdateRole<'_>: AuditLogReason<'static>);
190    assert_impl_all!(UpdateRolePositions<'_>: AuditLogReason<'static>);
191    assert_impl_all!(UpdateStageInstance<'_>: AuditLogReason<'static>);
192    assert_impl_all!(UpdateWebhook<'_>: AuditLogReason<'static>);
193}