twilight_http/request/scheduled_event/create_guild_scheduled_event/
voice.rs

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