Skip to main content

twilight_http/request/guild/
update_guild_welcome_screen.rs

1use crate::{
2    client::Client,
3    error::Error,
4    request::{self, AuditLogReason, 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::{Id, marker::GuildMarker},
13};
14use twilight_validate::request::{ValidationError, audit_reason as validate_audit_reason};
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    reason: Result<Option<&'a str>, ValidationError>,
37}
38
39impl<'a> UpdateGuildWelcomeScreen<'a> {
40    pub(crate) const fn new(http: &'a Client, guild_id: Id<GuildMarker>) -> Self {
41        Self {
42            fields: UpdateGuildWelcomeScreenFields {
43                description: None,
44                enabled: None,
45                welcome_channels: &[],
46            },
47            guild_id,
48            http,
49            reason: Ok(None),
50        }
51    }
52
53    /// Set the description of the welcome screen.
54    pub const fn description(mut self, description: &'a str) -> Self {
55        self.fields.description = Some(description);
56
57        self
58    }
59
60    /// Set whether the welcome screen is enabled.
61    pub const fn enabled(mut self, enabled: bool) -> Self {
62        self.fields.enabled = Some(enabled);
63
64        self
65    }
66
67    /// Set the channels linked in the welcome screen, with associated metadata.
68    pub const fn welcome_channels(mut self, welcome_channels: &'a [WelcomeScreenChannel]) -> Self {
69        self.fields.welcome_channels = welcome_channels;
70
71        self
72    }
73}
74
75impl<'a> AuditLogReason<'a> for UpdateGuildWelcomeScreen<'a> {
76    fn reason(mut self, reason: &'a str) -> Self {
77        self.reason = validate_audit_reason(reason).and(Ok(Some(reason)));
78
79        self
80    }
81}
82
83impl IntoFuture for UpdateGuildWelcomeScreen<'_> {
84    type Output = Result<Response<WelcomeScreen>, Error>;
85
86    type IntoFuture = ResponseFuture<WelcomeScreen>;
87
88    fn into_future(self) -> Self::IntoFuture {
89        let http = self.http;
90
91        match self.try_into_request() {
92            Ok(request) => http.request(request),
93            Err(source) => ResponseFuture::error(source),
94        }
95    }
96}
97
98impl TryIntoRequest for UpdateGuildWelcomeScreen<'_> {
99    fn try_into_request(self) -> Result<Request, Error> {
100        let mut request = Request::builder(&Route::UpdateGuildWelcomeScreen {
101            guild_id: self.guild_id.get(),
102        })
103        .json(&self.fields);
104
105        if let Some(reason) = self.reason.map_err(Error::validation)? {
106            request = request.headers(request::audit_header(reason)?);
107        }
108
109        request.build()
110    }
111}