Skip to main content

twilight_http/request/scheduled_event/create_guild_scheduled_event/
voice.rs

1use super::{CreateGuildScheduledEvent, CreateGuildScheduledEventFields};
2#[cfg(not(target_os = "wasi"))]
3use crate::response::{Response, ResponseFuture};
4use crate::{
5    error::Error,
6    request::{AuditLogReason, Request, TryIntoRequest},
7};
8use std::future::IntoFuture;
9use twilight_model::{
10    guild::scheduled_event::{EntityType, GuildScheduledEvent},
11    id::{Id, marker::ChannelMarker},
12    util::Timestamp,
13};
14use twilight_validate::request::{
15    audit_reason as validate_audit_reason,
16    scheduled_event_description as validate_scheduled_event_description,
17};
18
19/// Create a voice channel scheduled event in a guild.
20#[must_use = "requests must be configured and executed"]
21pub struct CreateGuildVoiceScheduledEvent<'a>(CreateGuildScheduledEvent<'a>);
22
23impl<'a> CreateGuildVoiceScheduledEvent<'a> {
24    pub(crate) fn new(
25        mut inner: CreateGuildScheduledEvent<'a>,
26        channel_id: Id<ChannelMarker>,
27        name: &'a str,
28        scheduled_start_time: &'a Timestamp,
29    ) -> Self {
30        inner.fields = inner.fields.map(|fields| CreateGuildScheduledEventFields {
31            channel_id: Some(channel_id),
32            entity_type: Some(EntityType::Voice),
33            name: Some(name),
34            scheduled_start_time: Some(scheduled_start_time),
35            ..fields
36        });
37
38        Self(inner)
39    }
40
41    /// Set the description of the event.
42    ///
43    /// Must be between 1 and 1000 characters in length.
44    ///
45    /// # Errors
46    ///
47    /// Returns an error of type [`ScheduledEventDescription`] if the
48    /// description is invalid.
49    ///
50    /// [`ScheduledEventDescription`]: twilight_validate::request::ValidationErrorType::ScheduledEventDescription
51    pub fn description(mut self, description: &'a str) -> Self {
52        self.0.fields = self.0.fields.and_then(|mut fields| {
53            validate_scheduled_event_description(description)?;
54            fields.description.replace(description);
55
56            Ok(fields)
57        });
58
59        self
60    }
61
62    /// Set the cover image of the event.
63    ///
64    /// This must be a Data URI, in the form of
65    /// `data:image/{type};base64,{data}` where `{type}` is the image MIME type
66    /// and `{data}` is the base64-encoded image. See [Discord Docs/Image Data].
67    ///
68    /// [Discord Docs/Image Data]: https://discord.com/developers/docs/reference#image-data
69    pub fn image(mut self, image: &'a str) -> Self {
70        self.0.fields = self.0.fields.map(|mut fields| {
71            fields.image = Some(image);
72
73            fields
74        });
75
76        self
77    }
78
79    /// Set the scheduled end time of the event.
80    ///
81    /// This is not a required field for voice channel events.
82    pub fn scheduled_end_time(mut self, scheduled_end_time: &'a Timestamp) -> Self {
83        self.0.fields = self.0.fields.map(|mut fields| {
84            fields.scheduled_end_time = Some(scheduled_end_time);
85
86            fields
87        });
88
89        self
90    }
91}
92
93impl<'a> AuditLogReason<'a> for CreateGuildVoiceScheduledEvent<'a> {
94    fn reason(mut self, reason: &'a str) -> Self {
95        self.0.reason = validate_audit_reason(reason).and(Ok(Some(reason)));
96
97        self
98    }
99}
100
101#[cfg(not(target_os = "wasi"))]
102impl IntoFuture for CreateGuildVoiceScheduledEvent<'_> {
103    type Output = Result<Response<GuildScheduledEvent>, Error>;
104
105    type IntoFuture = ResponseFuture<GuildScheduledEvent>;
106
107    fn into_future(self) -> Self::IntoFuture {
108        self.0.exec()
109    }
110}
111
112impl TryIntoRequest for CreateGuildVoiceScheduledEvent<'_> {
113    fn try_into_request(self) -> Result<Request, Error> {
114        self.0.try_into_request()
115    }
116}