twilight_http/request/guild/role/
update_role.rs1#[cfg(not(target_os = "wasi"))]
2use crate::response::{Response, ResponseFuture};
3use crate::{
4 client::Client,
5 error::Error,
6 request::{self, AuditLogReason, Nullable, Request, TryIntoRequest},
7 routing::Route,
8};
9use serde::Serialize;
10use std::future::IntoFuture;
11use twilight_model::{
12 guild::{Permissions, Role},
13 id::{
14 Id,
15 marker::{GuildMarker, RoleMarker},
16 },
17};
18use twilight_validate::request::{ValidationError, audit_reason as validate_audit_reason};
19
20#[derive(Serialize)]
21struct UpdateRoleFields<'a> {
22 #[serde(skip_serializing_if = "Option::is_none")]
23 color: Option<Nullable<u32>>,
24 #[serde(skip_serializing_if = "Option::is_none")]
25 hoist: Option<bool>,
26 #[serde(skip_serializing_if = "Option::is_none")]
27 icon: Option<Nullable<&'a str>>,
28 #[serde(skip_serializing_if = "Option::is_none")]
29 mentionable: Option<bool>,
30 #[serde(skip_serializing_if = "Option::is_none")]
31 name: Option<Nullable<&'a str>>,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 permissions: Option<Permissions>,
34 #[serde(skip_serializing_if = "Option::is_none")]
35 unicode_emoji: Option<Nullable<&'a str>>,
36}
37
38#[must_use = "requests must be configured and executed"]
40pub struct UpdateRole<'a> {
41 fields: UpdateRoleFields<'a>,
42 guild_id: Id<GuildMarker>,
43 http: &'a Client,
44 role_id: Id<RoleMarker>,
45 reason: Result<Option<&'a str>, ValidationError>,
46}
47
48impl<'a> UpdateRole<'a> {
49 pub(crate) const fn new(
50 http: &'a Client,
51 guild_id: Id<GuildMarker>,
52 role_id: Id<RoleMarker>,
53 ) -> Self {
54 Self {
55 fields: UpdateRoleFields {
56 color: None,
57 hoist: None,
58 icon: None,
59 mentionable: None,
60 name: None,
61 permissions: None,
62 unicode_emoji: None,
63 },
64 guild_id,
65 http,
66 role_id,
67 reason: Ok(None),
68 }
69 }
70
71 pub const fn color(mut self, color: Option<u32>) -> Self {
79 self.fields.color = Some(Nullable(color));
80
81 self
82 }
83
84 pub const fn hoist(mut self, hoist: bool) -> Self {
86 self.fields.hoist = Some(hoist);
87
88 self
89 }
90
91 pub const fn icon(mut self, icon: Option<&'a str>) -> Self {
129 self.fields.icon = Some(Nullable(icon));
130
131 self
132 }
133
134 pub const fn mentionable(mut self, mentionable: bool) -> Self {
136 self.fields.mentionable = Some(mentionable);
137
138 self
139 }
140
141 pub const fn name(mut self, name: Option<&'a str>) -> Self {
143 self.fields.name = Some(Nullable(name));
144
145 self
146 }
147
148 pub const fn permissions(mut self, permissions: Permissions) -> Self {
150 self.fields.permissions = Some(permissions);
151
152 self
153 }
154
155 pub const fn unicode_emoji(mut self, unicode_emoji: Option<&'a str>) -> Self {
188 self.fields.unicode_emoji = Some(Nullable(unicode_emoji));
189
190 self
191 }
192}
193
194impl<'a> AuditLogReason<'a> for UpdateRole<'a> {
195 fn reason(mut self, reason: &'a str) -> Self {
196 self.reason = validate_audit_reason(reason).and(Ok(Some(reason)));
197
198 self
199 }
200}
201
202#[cfg(not(target_os = "wasi"))]
203impl IntoFuture for UpdateRole<'_> {
204 type Output = Result<Response<Role>, Error>;
205
206 type IntoFuture = ResponseFuture<Role>;
207
208 fn into_future(self) -> Self::IntoFuture {
209 let http = self.http;
210
211 match self.try_into_request() {
212 Ok(request) => http.request(request),
213 Err(source) => ResponseFuture::error(source),
214 }
215 }
216}
217
218impl TryIntoRequest for UpdateRole<'_> {
219 fn try_into_request(self) -> Result<Request, Error> {
220 let mut request = Request::builder(&Route::UpdateRole {
221 guild_id: self.guild_id.get(),
222 role_id: self.role_id.get(),
223 });
224
225 request = request.json(&self.fields);
226
227 if let Some(reason) = self.reason.map_err(Error::validation)? {
228 request = request.headers(request::audit_header(reason)?);
229 }
230
231 request.build()
232 }
233}