twilight_http/request/guild/role/
update_role_positions.rs

1use crate::{
2    client::Client,
3    error::Error,
4    request::{self, AuditLogReason, Request, TryIntoRequest},
5    response::{marker::ListBody, Response, ResponseFuture},
6    routing::Route,
7};
8use std::future::IntoFuture;
9use twilight_model::{
10    guild::{Role, RolePosition},
11    id::{marker::GuildMarker, Id},
12};
13use twilight_validate::request::{audit_reason as validate_audit_reason, ValidationError};
14
15/// Modify the position of the roles.
16///
17/// The minimum amount of roles to modify, is a swap between two roles.
18#[must_use = "requests must be configured and executed"]
19pub struct UpdateRolePositions<'a> {
20    guild_id: Id<GuildMarker>,
21    http: &'a Client,
22    roles: &'a [RolePosition],
23    reason: Result<Option<&'a str>, ValidationError>,
24}
25
26impl<'a> UpdateRolePositions<'a> {
27    pub(crate) const fn new(
28        http: &'a Client,
29        guild_id: Id<GuildMarker>,
30        roles: &'a [RolePosition],
31    ) -> Self {
32        Self {
33            guild_id,
34            http,
35            roles,
36            reason: Ok(None),
37        }
38    }
39}
40
41impl<'a> AuditLogReason<'a> for UpdateRolePositions<'a> {
42    fn reason(mut self, reason: &'a str) -> Self {
43        self.reason = validate_audit_reason(reason).and(Ok(Some(reason)));
44
45        self
46    }
47}
48
49impl IntoFuture for UpdateRolePositions<'_> {
50    type Output = Result<Response<ListBody<Role>>, Error>;
51
52    type IntoFuture = ResponseFuture<ListBody<Role>>;
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 UpdateRolePositions<'_> {
65    fn try_into_request(self) -> Result<Request, Error> {
66        let mut request = Request::builder(&Route::UpdateRolePositions {
67            guild_id: self.guild_id.get(),
68        })
69        .json(&self.roles);
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}