1use serde::{Deserialize, Serialize};
4use strum::AsRefStr;
5use time::{OffsetDateTime, serde::rfc3339};
6use url::Url;
7
8#[derive(
10 Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, AsRefStr,
11)]
12#[serde(rename_all = "lowercase")]
13pub enum ReleaseStatus {
14 Public,
16 Private,
18 Hidden,
20}
21
22#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
24#[serde(rename_all = "camelCase")]
25pub struct UnityPackageSupports {
26 pub platform: String,
28 pub unity_version: String,
30}
31
32#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
34#[serde(rename_all = "camelCase")]
35pub struct UnityPackage {
36 pub id: crate::id::UnityPackage,
38 #[serde(flatten)]
39 pub supports: UnityPackageSupports,
41}
42
43#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
45#[serde(rename_all = "camelCase")]
46pub struct WorldData {
47 pub author_id: crate::id::User,
49 pub author_name: String,
51 pub capacity: u16,
53 #[serde(rename = "created_at", with = "rfc3339")]
55 pub created_at: OffsetDateTime,
56 pub favorites: u64,
58 pub heat: u32,
60 pub id: crate::id::World,
62 pub image_url: Url,
64 #[serde(
66 default,
67 deserialize_with = "crate::deserialize_optional_date",
68 serialize_with = "rfc3339::option::serialize"
69 )]
70 pub labs_publication_date: Option<OffsetDateTime>,
71 pub name: String,
73 pub occupants: u32,
75 pub organization: String,
77 pub popularity: u32,
79 #[serde(default)]
84 pub preview_youtube_id: Option<String>,
85 #[serde(
87 default,
88 deserialize_with = "crate::deserialize_optional_date",
89 serialize_with = "rfc3339::option::serialize"
90 )]
91 pub publication_date: Option<OffsetDateTime>,
92 pub release_status: ReleaseStatus,
94 pub tags: Vec<String>,
96 pub thumbnail_image_url: Url,
98 #[serde(rename = "updated_at", with = "rfc3339")]
100 pub updated_at: OffsetDateTime,
101 pub visits: u64,
103}
104
105#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
107#[serde(rename_all = "camelCase")]
108pub struct WorldListing {
109 #[serde(flatten)]
111 pub base: WorldData,
112 pub unity_packages: Vec<UnityPackageSupports>,
114}
115
116#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
118#[serde(rename_all = "camelCase")]
119pub struct World {
120 #[serde(flatten)]
122 pub base: WorldData,
123 pub featured: bool,
125 pub instances: Vec<(crate::id::Instance, u16)>,
127 pub private_occupants: u32,
129 pub public_occupants: u32,
131 pub unity_packages: Vec<UnityPackage>,
133 pub version: u32,
135}
136
137#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
139#[serde(rename_all = "camelCase")]
140pub struct Avatar {
141 pub id: crate::id::Avatar,
144}