use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use crate::model::UserBase;
#[cfg(feature = "http")]
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Hash,
strum::Display,
strum::EnumString,
Deserialize,
Serialize,
)]
#[serde(rename_all = "lowercase", from = "String")]
pub enum AssetTag {
Gore,
Violence,
Horror,
Jumpscare,
ExtremelySmall,
ExtremelyHuge,
Suggestive,
Nudity,
ExtremelyBright,
FlashingColors,
FlashingLights,
ParticleSystems,
ScreenEffects,
ContainsMusic,
LoudAudio,
SpawnAudio,
LongRangeAudio,
#[strum(disabled)]
Other(String),
}
impl From<String> for AssetTag {
fn from(value: String) -> Self {
use std::str::FromStr;
Self::from_str(&value).unwrap_or(Self::Other(value))
}
}
#[cfg(feature = "http")]
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AssetBase<Id = crate::id::Asset> {
pub id: Id,
pub name: String,
pub image_url: String,
}
#[cfg(feature = "http")]
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde_with::serde_as]
#[serde(rename_all = "camelCase")]
pub struct AssetBaseWithTags {
#[serde(flatten)]
pub base: AssetBase,
#[serde(default)]
#[cfg_attr(
not(feature = "debug"),
serde_as(as = "serde_with::VecSkipError<_>")
)]
pub tags: Vec<AssetTag>,
}
#[cfg(feature = "http")]
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde_with::serde_as]
#[serde(rename_all = "camelCase")]
pub struct AssetBaseWithCategories<Id = crate::id::Asset> {
#[serde(flatten)]
pub base: AssetBase<Id>,
#[serde(default)]
#[cfg_attr(
not(feature = "debug"),
serde_as(as = "serde_with::VecSkipError<_>")
)]
pub categories: Vec<String>,
}
#[cfg(feature = "http")]
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AssetFile {
pub asset: AssetBaseWithTags,
#[serde(rename = "fileId")]
pub file_id: crate::id::File,
#[serde(rename = "fileSize")]
pub size: String,
#[serde(rename = "fileKey")]
pub key: String,
#[serde(rename = "fileHash")]
pub hash: String,
#[serde(rename = "fileLocation")]
pub url: String,
}
#[cfg(feature = "http")]
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde_with::serde_as]
#[serde(rename_all = "camelCase")]
pub struct AvatarDetails {
#[serde(flatten)]
pub base: AssetBaseWithCategories,
pub description: String,
#[serde(rename = "authorGuid")]
pub author_id: crate::id::User,
}
#[cfg(feature = "http")]
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AvatarAssetDetails {
#[serde(flatten)]
pub base: AssetBaseWithTags,
pub description: String,
pub user: UserBase,
pub uploaded_at: OffsetDateTime,
pub updated_at: OffsetDateTime,
pub switch_permitted: bool,
pub is_published: bool,
#[serde(default)]
pub categories: Vec<String>,
pub filesize: u64,
}