Skip to main content

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