twilight_http/request/guild/member/
remove_role_from_member.rs1#[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#[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}