use std::hash::Hash;
use awaur::serde_with::Base62;
use serde::{Deserialize, Serialize};
use serde_with::serde_as;
use strum::EnumString;
use time::OffsetDateTime;
#[serde_as]
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Project {
#[serde_as(as = "Base62")]
pub id: u64,
pub slug: Option<String>,
pub project_type: ProjectType,
#[serde_as(as = "Base62")]
pub team: u64,
pub title: String,
pub description: String,
pub body: String,
#[deprecated]
pub body_url: Option<String>,
#[serde(with = "time::serde::rfc3339")]
pub published: OffsetDateTime,
#[serde(with = "time::serde::rfc3339")]
pub updated: OffsetDateTime,
pub status: ProjectStatus,
pub moderator_message: Option<ModeratorMessage>,
pub license: ProjectLicense,
pub client_side: SideSupport,
pub server_side: SideSupport,
pub downloads: usize,
pub followers: usize,
pub categories: Vec<String>,
#[serde_as(as = "Vec<Base62>")]
pub versions: Vec<u64>,
pub icon_url: Option<String>,
pub issues_url: Option<String>,
pub source_url: Option<String>,
pub wiki_url: Option<String>,
pub discord_url: Option<String>,
pub donation_urls: Option<Vec<DonationLink>>,
pub gallery: Vec<GalleryItem>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, EnumString, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[strum(serialize_all = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum ProjectType {
Mod,
Modpack,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, EnumString, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[strum(serialize_all = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum ProjectStatus {
Approved,
Archived,
Rejected,
Draft,
Unlisted,
Processing,
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ModeratorMessage {
pub message: String,
pub body: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ProjectLicense {
pub id: String,
pub name: String,
pub url: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, EnumString, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[strum(serialize_all = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum SideSupport {
Required,
Optional,
Unsupported,
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct DonationLink {
pub id: String,
pub platform: String,
pub url: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct GalleryItem {
pub url: String,
pub featured: bool,
pub title: Option<String>,
pub description: Option<String>,
#[serde(with = "time::serde::rfc3339")]
pub created: OffsetDateTime,
}