Skip to main content

twilight_http/request/application/command/
update_command_permissions.rs

1#[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/// Update command permissions for a single command in a guild.
28///
29/// Note that this overwrites the command permissions, so the full set of
30/// permissions has to be sent every time.
31///
32/// This request requires that the client was configured with an OAuth2 Bearer
33/// token.
34#[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}