twilight_http/request/guild/
update_guild_welcome_screen.rs

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