Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion twilight-http/src/request/audit_reason.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ mod private {
member::{AddRoleToMember, RemoveMember, RemoveRoleFromMember, UpdateGuildMember},
role::{CreateRole, DeleteRole, UpdateRole},
sticker::{CreateGuildSticker, UpdateGuildSticker},
CreateGuildChannel, CreateGuildPrune, UpdateCurrentMember, UpdateGuild,
CreateGuildChannel, CreateGuildPrune, UpdateCurrentMember, UpdateGuild, UpdateGuildMfa,
},
scheduled_event::{
CreateGuildExternalScheduledEvent, CreateGuildScheduledEvent,
Expand Down Expand Up @@ -78,6 +78,7 @@ mod private {
impl Sealed for UpdateEmoji<'_> {}
impl Sealed for UpdateGuild<'_> {}
impl Sealed for UpdateGuildMember<'_> {}
impl Sealed for UpdateGuildMfa<'_> {}
impl Sealed for UpdateGuildScheduledEvent<'_> {}
impl Sealed for UpdateGuildSticker<'_> {}
impl Sealed for UpdateRole<'_> {}
Expand Down
29 changes: 25 additions & 4 deletions twilight-http/src/request/guild/update_guild_mfa.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use crate::{
client::Client,
error::Error,
request::{Request, TryIntoRequest},
request::{self, AuditLogReason, Request, TryIntoRequest},
response::ResponseFuture,
routing::Route,
};
Expand All @@ -10,24 +10,29 @@ use twilight_model::{
guild::MfaLevel,
id::{marker::GuildMarker, Id},
};
use twilight_validate::request::{audit_reason as validate_audit_reason, ValidationError};

#[derive(Serialize)]
struct UpdateGuildMfaFields {
struct UpdateGuildMfaFields<'a> {
level: MfaLevel,
reason: Option<&'a str>,
}

/// Update a guild's MFA level.
#[must_use = "requests must be configured and executed"]
pub struct UpdateGuildMfa<'a> {
fields: UpdateGuildMfaFields,
fields: UpdateGuildMfaFields<'a>,
guild_id: Id<GuildMarker>,
http: &'a Client,
}

impl<'a> UpdateGuildMfa<'a> {
pub(crate) const fn new(http: &'a Client, guild_id: Id<GuildMarker>, level: MfaLevel) -> Self {
Self {
fields: UpdateGuildMfaFields { level },
fields: UpdateGuildMfaFields {
level,
reason: None,
},
guild_id,
http,
}
Expand All @@ -46,12 +51,28 @@ impl<'a> UpdateGuildMfa<'a> {
}
}

impl<'a> AuditLogReason<'a> for UpdateGuildMfa<'a> {
fn reason(mut self, reason: &'a str) -> Result<Self, ValidationError> {
validate_audit_reason(reason)?;

self.fields.reason.replace(reason);

Ok(self)
}
}

impl TryIntoRequest for UpdateGuildMfa<'_> {
fn try_into_request(self) -> Result<Request, Error> {
let mut request = Request::builder(&Route::UpdateGuildMfa {
guild_id: self.guild_id.get(),
});

if let Some(reason) = self.fields.reason.as_ref() {
let header = request::audit_header(reason)?;

request = request.headers(header);
}

request = request.json(&self.fields)?;

Ok(request.build())
Expand Down