Skip to main content

twilight_http/request/guild/
update_guild_welcome_screen.rs

1#[cfg(not(target_os = "wasi"))]
2use crate::response::{Response, ResponseFuture};
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    guild::invite::{WelcomeScreen, WelcomeScreenChannel},
13    id::{Id, marker::GuildMarker},
14};
15
16#[derive(Serialize)]
17struct UpdateGuildWelcomeScreenFields<'a> {
18    #[serde(skip_serializing_if = "Option::is_none")]
19    description: Option<&'a str>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    enabled: Option<bool>,
22    #[serde(skip_serializing_if = "<[_]>::is_empty")]
23    welcome_channels: &'a [WelcomeScreenChannel],
24}
25
26/// Update the guild's welcome screen.
27///
28/// Requires the [`MANAGE_GUILD`] permission.
29///
30/// [`MANAGE_GUILD`]: twilight_model::guild::Permissions::MANAGE_GUILD
31#[must_use = "requests must be configured and executed"]
32pub struct UpdateGuildWelcomeScreen<'a> {
33    fields: UpdateGuildWelcomeScreenFields<'a>,
34    guild_id: Id<GuildMarker>,
35    http: &'a Client,
36}
37
38impl<'a> UpdateGuildWelcomeScreen<'a> {
39    pub(crate) const fn new(http: &'a Client, guild_id: Id<GuildMarker>) -> Self {
40        Self {
41            fields: UpdateGuildWelcomeScreenFields {
42                description: None,
43                enabled: None,
44                welcome_channels: &[],
45            },
46            guild_id,
47            http,
48        }
49    }
50
51    /// Set the description of the welcome screen.
52    pub const fn description(mut self, description: &'a str) -> Self {
53        self.fields.description = Some(description);
54
55        self
56    }
57
58    /// Set whether the welcome screen is enabled.
59    pub const fn enabled(mut self, enabled: bool) -> Self {
60        self.fields.enabled = Some(enabled);
61
62        self
63    }
64
65    /// Set the channels linked in the welcome screen, with associated metadata.
66    pub const fn welcome_channels(mut self, welcome_channels: &'a [WelcomeScreenChannel]) -> Self {
67        self.fields.welcome_channels = welcome_channels;
68
69        self
70    }
71}
72
73#[cfg(not(target_os = "wasi"))]
74impl IntoFuture for UpdateGuildWelcomeScreen<'_> {
75    type Output = Result<Response<WelcomeScreen>, Error>;
76
77    type IntoFuture = ResponseFuture<WelcomeScreen>;
78
79    fn into_future(self) -> Self::IntoFuture {
80        let http = self.http;
81
82        match self.try_into_request() {
83            Ok(request) => http.request(request),
84            Err(source) => ResponseFuture::error(source),
85        }
86    }
87}
88
89impl TryIntoRequest for UpdateGuildWelcomeScreen<'_> {
90    fn try_into_request(self) -> Result<Request, Error> {
91        Request::builder(&Route::UpdateGuildWelcomeScreen {
92            guild_id: self.guild_id.get(),
93        })
94        .json(&self.fields)
95        .build()
96    }
97}