use serde::{Deserialize, Serialize};
use strum::AsRefStr;
use time::{OffsetDateTime, serde::rfc3339};
use url::Url;
#[derive(
Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, AsRefStr,
)]
#[serde(rename_all = "lowercase")]
pub enum ReleaseStatus {
Public,
Private,
Hidden,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UnityPackageSupports {
pub platform: String,
pub unity_version: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UnityPackage {
pub id: crate::id::UnityPackage,
#[serde(flatten)]
pub supports: UnityPackageSupports,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WorldData {
pub author_id: crate::id::User,
pub author_name: String,
pub capacity: u16,
#[serde(rename = "created_at", with = "rfc3339")]
pub created_at: OffsetDateTime,
pub favorites: u64,
pub heat: u32,
pub id: crate::id::World,
pub image_url: Url,
#[serde(
default,
deserialize_with = "crate::deserialize_optional_date",
serialize_with = "rfc3339::option::serialize"
)]
pub labs_publication_date: Option<OffsetDateTime>,
pub name: String,
pub occupants: u32,
pub organization: String,
pub popularity: u32,
#[serde(default)]
pub preview_youtube_id: Option<String>,
#[serde(
default,
deserialize_with = "crate::deserialize_optional_date",
serialize_with = "rfc3339::option::serialize"
)]
pub publication_date: Option<OffsetDateTime>,
pub release_status: ReleaseStatus,
pub tags: Vec<String>,
pub thumbnail_image_url: Url,
#[serde(rename = "updated_at", with = "rfc3339")]
pub updated_at: OffsetDateTime,
pub visits: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WorldListing {
#[serde(flatten)]
pub base: WorldData,
pub unity_packages: Vec<UnityPackageSupports>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct World {
#[serde(flatten)]
pub base: WorldData,
pub featured: bool,
pub instances: Vec<(crate::id::Instance, u16)>,
pub private_occupants: u32,
pub public_occupants: u32,
pub unity_packages: Vec<UnityPackage>,
pub version: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Avatar {
pub id: crate::id::Avatar,
}