1use crate::id::{NumericId, StringId};
2use serde::{Deserialize, Serialize};
3use time::OffsetDateTime;
4
5#[derive(Debug, Clone, Copy, Serialize, Deserialize, Eq, PartialEq)]
6#[serde(rename_all = "snake_case")]
7pub enum SpaceState {
8 Live,
9 Scheduled,
10 Ended,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
14pub struct SpaceTopic {
15 pub id: StringId,
16 pub name: String,
17 pub description: Option<String>,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
21pub struct Space {
22 pub id: StringId,
23 pub state: SpaceState,
24 #[serde(skip_serializing_if = "Option::is_none")]
25 pub is_ticketed: Option<bool>,
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub participant_count: Option<usize>,
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub title: Option<String>,
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub host_ids: Option<Vec<NumericId>>,
32 #[serde(
33 default,
34 with = "time::serde::rfc3339::option",
35 skip_serializing_if = "Option::is_none"
36 )]
37 pub updated_at: Option<OffsetDateTime>,
38 #[serde(
39 default,
40 with = "time::serde::rfc3339::option",
41 skip_serializing_if = "Option::is_none"
42 )]
43 pub created_at: Option<OffsetDateTime>,
44 #[serde(skip_serializing_if = "Option::is_none")]
45 pub creator_id: Option<NumericId>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 pub lang: Option<String>,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub speaker_ids: Option<Vec<NumericId>>,
50 #[serde(skip_serializing_if = "Option::is_none")]
51 pub invited_user_ids: Option<Vec<NumericId>>,
52 #[serde(
53 default,
54 with = "time::serde::rfc3339::option",
55 skip_serializing_if = "Option::is_none"
56 )]
57 pub scheduled_start: Option<OffsetDateTime>,
58 #[serde(
59 default,
60 with = "time::serde::rfc3339::option",
61 skip_serializing_if = "Option::is_none"
62 )]
63 pub started_at: Option<OffsetDateTime>,
64 #[serde(
65 default,
66 with = "time::serde::rfc3339::option",
67 skip_serializing_if = "Option::is_none"
68 )]
69 pub ended_at: Option<OffsetDateTime>,
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub topic_ids: Option<Vec<StringId>>,
72 #[serde(skip_serializing_if = "Option::is_none")]
73 pub topics: Option<Vec<SpaceTopic>>,
74 #[serde(skip_serializing_if = "Option::is_none")]
75 pub subscriber_count: Option<usize>,
76}