Skip to main content

twilight_http/request/guild/member/
remove_role_from_member.rs

1#[cfg(not(target_os = "wasi"))]
2use crate::response::{Response, ResponseFuture, marker::EmptyBody};
3use crate::{
4    client::Client,
5    error::Error,
6    request::{self, AuditLogReason, Request, TryIntoRequest},
7    routing::Route,
8};
9use std::future::IntoFuture;
10use twilight_model::id::{
11    Id,
12    marker::{GuildMarker, RoleMarker, UserMarker},
13};
14use twilight_validate::request::{ValidationError, audit_reason as validate_audit_reason};
15
16/// Remove a role from a member in a guild, by id.
17#[must_use = "requests must be configured and executed"]
18pub struct RemoveRoleFromMember<'a> {
19    guild_id: Id<GuildMarker>,
20    http: &'a Client,
21    role_id: Id<RoleMarker>,
22    user_id: Id<UserMarker>,
23    reason: Result<Option<&'a str>, ValidationError>,
24}
25
26impl<'a> RemoveRoleFromMember<'a> {
27    pub(crate) const fn new(
28        http: &'a Client,
29        guild_id: Id<GuildMarker>,
30        user_id: Id<UserMarker>,
31        role_id: Id<RoleMarker>,
32    ) -> Self {
33        Self {
34            guild_id,
35            http,
36            role_id,
37            user_id,
38            reason: Ok(None),
39        }
40    }
41}
42
43impl<'a> AuditLogReason<'a> for RemoveRoleFromMember<'a> {
44    fn reason(mut self, reason: &'a str) -> Self {
45        self.reason = validate_audit_reason(reason).and(Ok(Some(reason)));
46
47        self
48    }
49}
50
51#[cfg(not(target_os = "wasi"))]
52impl IntoFuture for RemoveRoleFromMember<'_> {
53    type Output = Result<Response<EmptyBody>, Error>;
54
55    type IntoFuture = ResponseFuture<EmptyBody>;
56
57    fn into_future(self) -> Self::IntoFuture {
58        let http = self.http;
59
60        match self.try_into_request() {
61            Ok(request) => http.request(request),
62            Err(source) => ResponseFuture::error(source),
63        }
64    }
65}
66
67impl TryIntoRequest for RemoveRoleFromMember<'_> {
68    fn try_into_request(self) -> Result<Request, Error> {
69        let mut request = Request::builder(&Route::RemoveMemberRole {
70            guild_id: self.guild_id.get(),
71            role_id: self.role_id.get(),
72            user_id: self.user_id.get(),
73        });
74
75        if let Some(reason) = self.reason.map_err(Error::validation)? {
76            request = request.headers(request::audit_header(reason)?);
77        }
78
79        request.build()
80    }
81}