Skip to main content

twilight_http/request/guild/
update_guild_onboarding.rs

1use std::future::IntoFuture;
2
3use twilight_model::{
4    guild::onboarding::{Onboarding, OnboardingMode, OnboardingPromptEmoji, OnboardingPromptType},
5    id::{
6        Id,
7        marker::{
8            ChannelMarker, GuildMarker, OnboardingPromptMarker, OnboardingPromptOptionMarker,
9            RoleMarker,
10        },
11    },
12};
13
14use serde::{Deserialize, Serialize};
15
16#[cfg(not(target_os = "wasi"))]
17use crate::response::{Response, ResponseFuture};
18use crate::{
19    client::Client,
20    error::Error,
21    request::{self, AuditLogReason, Request, TryIntoRequest},
22    routing::Route,
23};
24
25use twilight_validate::request::{ValidationError, audit_reason as validate_audit_reason};
26
27#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
28pub struct UpdateOnboardingPromptOption {
29    pub channel_ids: Vec<Id<ChannelMarker>>,
30    pub description: Option<String>,
31    pub emoji: OnboardingPromptEmoji,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub id: Option<Id<OnboardingPromptOptionMarker>>,
34    pub role_ids: Vec<Id<RoleMarker>>,
35    pub title: String,
36}
37
38#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
39pub struct UpdateGuildOnboardingPrompt {
40    pub id: Id<OnboardingPromptMarker>,
41    pub in_onboarding: bool,
42    #[serde(rename = "type")]
43    pub kind: OnboardingPromptType,
44    pub options: Vec<UpdateOnboardingPromptOption>,
45    pub required: bool,
46    pub single_select: bool,
47    pub title: String,
48}
49
50#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
51pub struct UpdateGuildOnboardingFields {
52    pub default_channel_ids: Vec<Id<ChannelMarker>>,
53    pub prompts: Vec<UpdateGuildOnboardingPrompt>,
54    pub enabled: bool,
55    pub mode: OnboardingMode,
56}
57
58/// Update the guild's onboarding flow
59#[must_use = "requests must be configured and executed"]
60pub struct UpdateGuildOnboarding<'a> {
61    fields: UpdateGuildOnboardingFields,
62    guild_id: Id<GuildMarker>,
63    http: &'a Client,
64    reason: Result<Option<&'a str>, ValidationError>,
65}
66
67impl<'a> UpdateGuildOnboarding<'a> {
68    pub(crate) const fn new(
69        http: &'a Client,
70        guild_id: Id<GuildMarker>,
71        fields: UpdateGuildOnboardingFields,
72    ) -> Self {
73        Self {
74            fields,
75            guild_id,
76            http,
77            reason: Ok(None),
78        }
79    }
80}
81
82impl<'a> AuditLogReason<'a> for UpdateGuildOnboarding<'a> {
83    fn reason(mut self, reason: &'a str) -> Self {
84        self.reason = validate_audit_reason(reason).and(Ok(Some(reason)));
85
86        self
87    }
88}
89
90#[cfg(not(target_os = "wasi"))]
91impl IntoFuture for UpdateGuildOnboarding<'_> {
92    type Output = Result<Response<Onboarding>, Error>;
93
94    type IntoFuture = ResponseFuture<Onboarding>;
95
96    fn into_future(self) -> Self::IntoFuture {
97        let http = self.http;
98
99        match self.try_into_request() {
100            Ok(request) => http.request(request),
101            Err(source) => ResponseFuture::error(source),
102        }
103    }
104}
105
106impl TryIntoRequest for UpdateGuildOnboarding<'_> {
107    fn try_into_request(self) -> Result<Request, Error> {
108        let mut request = Request::builder(&Route::UpdateGuildOnboarding {
109            guild_id: self.guild_id.get(),
110        });
111
112        request = request.json(&self.fields);
113
114        if let Some(reason) = self.reason.map_err(Error::validation)? {
115            let header = request::audit_header(reason)?;
116
117            request = request.headers(header);
118        }
119
120        request.build()
121    }
122}