use racal::Queryable;
use serde::{Deserialize, Serialize};
use strum::AsRefStr;
use super::{Authentication, Order, Pagination};
use crate::model::ReleaseStatus;
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize, AsRefStr,
)]
#[serde(rename_all = "camelCase")]
#[allow(missing_docs)]
#[strum(serialize_all = "camelCase")]
pub enum WorldsSort {
Popularity,
Heat,
Trust,
Shuffle,
Random,
Favorites,
ReportScore,
ReportCount,
PublicationDate,
LabsPublicationDate,
Created,
#[strum(serialize = " _created_at")]
#[serde(rename = " _created_at")]
CreatedAt,
Updated,
#[strum(serialize = " _updated_at")]
#[serde(rename = " _updated_at")]
UpdatedAt,
Order,
Relevance,
Magic,
Name,
}
impl Default for WorldsSort {
fn default() -> Self { Self::Heat }
}
#[derive(
Default, Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize,
)]
pub struct ActiveWorlds {
pub featured: Option<bool>,
pub sort: WorldsSort,
pub order: Order,
pub search: Option<String>,
pub tag: Option<String>,
pub no_tag: Option<String>,
pub release_status: Option<ReleaseStatus>,
pub max_unity_version: Option<String>,
pub min_unity_version: Option<String>,
pub platform: Option<String>,
#[serde(flatten)]
pub pagination: Pagination,
}
impl Queryable<Authentication, Vec<crate::model::WorldListing>>
for ActiveWorlds
{
fn url(&self, _: &Authentication) -> String {
let mut query = format!(
"{}/worlds/active?{}&sort={}&order={}",
crate::API_BASE_URI,
self.pagination.to_query_str(),
&self.sort.as_ref(),
&self.order.as_ref(),
);
if let Some(release_status) = &self.release_status {
query.push_str("&releaseStatus=");
query.push_str(release_status.as_ref());
}
if let Some(featured) = &self.featured {
query.push_str("&featured=");
query.push_str(&featured.to_string());
}
if let Some(search) = &self.search {
query.push_str("&search=");
query.push_str(search);
}
if let Some(tag) = &self.tag {
query.push_str("&tag=");
query.push_str(tag);
}
if let Some(no_tag) = &self.no_tag {
query.push_str("¬ag=");
query.push_str(no_tag);
}
if let Some(max_unity_version) = &self.max_unity_version {
query.push_str("&maxUnityVersion=");
query.push_str(max_unity_version);
}
if let Some(min_unity_version) = &self.min_unity_version {
query.push_str("&minUnityVersion=");
query.push_str(min_unity_version);
}
if let Some(platform) = &self.platform {
query.push_str("&platform=");
query.push_str(platform);
}
query
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub struct World {
pub id: crate::id::World,
}
impl Queryable<Authentication, crate::model::World> for World {
fn url(&self, _: &Authentication) -> String {
format!("{}/worlds/{}", crate::API_BASE_URI, self.id.as_ref())
}
}