twilight_model/guild/scheduled_event/
mod.rs1pub mod recurrence_rule;
4
5mod user;
6
7pub use self::user::GuildScheduledEventUser;
8
9use crate::{
10 guild::scheduled_event::recurrence_rule::RecurrenceRule,
11 id::{
12 Id,
13 marker::{
14 ChannelMarker, GuildMarker, ScheduledEventEntityMarker, ScheduledEventMarker,
15 UserMarker,
16 },
17 },
18 user::User,
19 util::{ImageHash, Timestamp},
20};
21use serde::{Deserialize, Serialize};
22
23#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
31pub struct GuildScheduledEvent {
32 #[serde(skip_serializing_if = "Option::is_none")]
37 pub channel_id: Option<Id<ChannelMarker>>,
38 #[serde(skip_serializing_if = "Option::is_none")]
42 pub creator: Option<User>,
43 #[serde(skip_serializing_if = "Option::is_none")]
47 pub creator_id: Option<Id<UserMarker>>,
48 #[serde(skip_serializing_if = "Option::is_none")]
50 pub description: Option<String>,
51 #[serde(skip_serializing_if = "Option::is_none")]
53 pub entity_id: Option<Id<ScheduledEventEntityMarker>>,
54 #[serde(skip_serializing_if = "Option::is_none")]
58 pub entity_metadata: Option<EntityMetadata>,
59 pub entity_type: EntityType,
61 pub guild_id: Id<GuildMarker>,
63 pub id: Id<ScheduledEventMarker>,
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub image: Option<ImageHash>,
68 pub name: String,
70 pub privacy_level: PrivacyLevel,
72 pub recurrence_rule: Option<RecurrenceRule>,
74 #[serde(skip_serializing_if = "Option::is_none")]
79 pub scheduled_end_time: Option<Timestamp>,
80 pub scheduled_start_time: Timestamp,
82 pub status: Status,
84 #[serde(skip_serializing_if = "Option::is_none")]
86 pub user_count: Option<u64>,
87}
88
89#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, PartialEq, Serialize)]
91pub struct EntityMetadata {
92 pub location: Option<String>,
94}
95
96#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
98#[non_exhaustive]
99#[serde(from = "u8", into = "u8")]
100pub enum EntityType {
101 StageInstance,
103 Voice,
105 External,
107 Unknown(u8),
109}
110
111impl From<u8> for EntityType {
112 fn from(value: u8) -> Self {
113 match value {
114 1 => EntityType::StageInstance,
115 2 => EntityType::Voice,
116 3 => EntityType::External,
117 unknown => EntityType::Unknown(unknown),
118 }
119 }
120}
121
122impl From<EntityType> for u8 {
123 fn from(value: EntityType) -> Self {
124 match value {
125 EntityType::StageInstance => 1,
126 EntityType::Voice => 2,
127 EntityType::External => 3,
128 EntityType::Unknown(unknown) => unknown,
129 }
130 }
131}
132
133#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
135#[non_exhaustive]
136#[serde(from = "u8", into = "u8")]
137pub enum PrivacyLevel {
138 GuildOnly,
140 Unknown(u8),
142}
143
144impl From<u8> for PrivacyLevel {
145 fn from(value: u8) -> Self {
146 match value {
147 2 => PrivacyLevel::GuildOnly,
148 unknown => PrivacyLevel::Unknown(unknown),
149 }
150 }
151}
152
153impl From<PrivacyLevel> for u8 {
154 fn from(value: PrivacyLevel) -> Self {
155 match value {
156 PrivacyLevel::GuildOnly => 2,
157 PrivacyLevel::Unknown(unknown) => unknown,
158 }
159 }
160}
161
162#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
164#[non_exhaustive]
165#[serde(from = "u8", into = "u8")]
166pub enum Status {
167 Scheduled,
171 Active,
175 Completed,
177 Cancelled,
179 Unknown(u8),
181}
182
183impl From<u8> for Status {
184 fn from(value: u8) -> Self {
185 match value {
186 1 => Status::Scheduled,
187 2 => Status::Active,
188 3 => Status::Completed,
189 4 => Status::Cancelled,
190 unknown => Status::Unknown(unknown),
191 }
192 }
193}
194
195impl From<Status> for u8 {
196 fn from(value: Status) -> Self {
197 match value {
198 Status::Scheduled => 1,
199 Status::Active => 2,
200 Status::Completed => 3,
201 Status::Cancelled => 4,
202 Status::Unknown(unknown) => unknown,
203 }
204 }
205}
206
207#[cfg(test)]
208mod tests {
209 use super::*;
210 use crate::test::image_hash::{COVER, COVER_INPUT};
211 use serde_test::Token;
212 use std::error::Error;
213
214 #[test]
215 fn scheduled_event() -> Result<(), Box<dyn Error>> {
216 let scheduled_start_time = Timestamp::parse("2022-01-01T00:00:00.000000+00:00")?;
217
218 let value = GuildScheduledEvent {
219 channel_id: Some(Id::new(1)),
220 creator: None,
221 creator_id: None,
222 description: Some("this is a dance party for garfield lovers".into()),
223 entity_id: Some(Id::new(2)),
224 entity_metadata: None,
225 entity_type: EntityType::StageInstance,
226 guild_id: Id::new(3),
227 id: Id::new(4),
228 image: Some(COVER),
229 name: "garfield dance party".into(),
230 privacy_level: PrivacyLevel::GuildOnly,
231 recurrence_rule: None,
232 scheduled_end_time: None,
233 scheduled_start_time,
234 status: Status::Completed,
235 user_count: Some(1),
236 };
237
238 serde_test::assert_tokens(
239 &value,
240 &[
241 Token::Struct {
242 name: "GuildScheduledEvent",
243 len: 13,
244 },
245 Token::Str("channel_id"),
246 Token::Some,
247 Token::NewtypeStruct { name: "Id" },
248 Token::Str("1"),
249 Token::Str("description"),
250 Token::Some,
251 Token::Str("this is a dance party for garfield lovers"),
252 Token::Str("entity_id"),
253 Token::Some,
254 Token::NewtypeStruct { name: "Id" },
255 Token::Str("2"),
256 Token::Str("entity_type"),
257 Token::U8(1),
258 Token::Str("guild_id"),
259 Token::NewtypeStruct { name: "Id" },
260 Token::Str("3"),
261 Token::Str("id"),
262 Token::NewtypeStruct { name: "Id" },
263 Token::Str("4"),
264 Token::Str("image"),
265 Token::Some,
266 Token::Str(COVER_INPUT),
267 Token::Str("name"),
268 Token::Str("garfield dance party"),
269 Token::Str("privacy_level"),
270 Token::U8(2),
271 Token::Str("recurrence_rule"),
272 Token::None,
273 Token::Str("scheduled_start_time"),
274 Token::Str("2022-01-01T00:00:00.000000+00:00"),
275 Token::Str("status"),
276 Token::U8(3),
277 Token::Str("user_count"),
278 Token::Some,
279 Token::U64(1),
280 Token::StructEnd,
281 ],
282 );
283
284 Ok(())
285 }
286}