twilight_http/request/application/command/
update_command_permissions.rs1#[cfg(not(target_os = "wasi"))]
2use crate::response::{Response, ResponseFuture, marker::ListBody};
3use crate::{
4 client::Client,
5 error::Error,
6 request::{Request, TryIntoRequest},
7 routing::Route,
8};
9use serde::Serialize;
10use std::future::IntoFuture;
11use twilight_model::{
12 application::command::permissions::CommandPermission,
13 id::{
14 Id,
15 marker::{ApplicationMarker, CommandMarker, GuildMarker},
16 },
17};
18use twilight_validate::command::{
19 CommandValidationError, guild_permissions as validate_guild_permissions,
20};
21
22#[derive(Serialize)]
23struct UpdateCommandPermissionsFields<'a> {
24 pub permissions: &'a [CommandPermission],
25}
26
27#[must_use = "requests must be configured and executed"]
35pub struct UpdateCommandPermissions<'a> {
36 application_id: Id<ApplicationMarker>,
37 command_id: Id<CommandMarker>,
38 guild_id: Id<GuildMarker>,
39 fields: Result<UpdateCommandPermissionsFields<'a>, CommandValidationError>,
40 http: &'a Client,
41}
42
43impl<'a> UpdateCommandPermissions<'a> {
44 pub(crate) fn new(
45 http: &'a Client,
46 application_id: Id<ApplicationMarker>,
47 guild_id: Id<GuildMarker>,
48 command_id: Id<CommandMarker>,
49 permissions: &'a [CommandPermission],
50 ) -> Self {
51 let fields = Ok(UpdateCommandPermissionsFields { permissions }).and_then(|fields| {
52 validate_guild_permissions(permissions.len())?;
53
54 Ok(fields)
55 });
56
57 Self {
58 application_id,
59 command_id,
60 guild_id,
61 fields,
62 http,
63 }
64 }
65}
66
67#[cfg(not(target_os = "wasi"))]
68impl IntoFuture for UpdateCommandPermissions<'_> {
69 type Output = Result<Response<ListBody<CommandPermission>>, Error>;
70
71 type IntoFuture = ResponseFuture<ListBody<CommandPermission>>;
72
73 fn into_future(self) -> Self::IntoFuture {
74 let http = self.http;
75
76 match self.try_into_request() {
77 Ok(request) => http.request(request),
78 Err(source) => ResponseFuture::error(source),
79 }
80 }
81}
82
83impl TryIntoRequest for UpdateCommandPermissions<'_> {
84 fn try_into_request(self) -> Result<Request, Error> {
85 let fields = self.fields.map_err(Error::validation)?;
86
87 Request::builder(&Route::UpdateCommandPermissions {
88 application_id: self.application_id.get(),
89 command_id: self.command_id.get(),
90 guild_id: self.guild_id.get(),
91 })
92 .json(&fields)
93 .build()
94 }
95}