Skip to main content

twilight_http/request/scheduled_event/create_guild_scheduled_event/
external.rs

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