twilight_http/request/guild/role/
update_role_positions.rs1use 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#[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}