twilight_http/request/guild/
update_guild_onboarding.rs1use 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#[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}