use crate::deser::{empty_as_none, parse_timestamp, u16_from_str, u64_from_str, unit_array};
use serde::Deserialize;
#[derive(Debug, Deserialize)]
#[non_exhaustive]
pub struct Torrent {
pub descr: String,
pub language: Option<usize>,
pub textlanguage: Option<usize>,
#[serde(flatten)]
pub partial: PartialTorrent,
}
#[derive(Debug, Deserialize)]
#[non_exhaustive]
pub struct PartialTorrent {
#[serde(deserialize_with = "u64_from_str")]
pub id: u64,
pub name: String,
pub info_hash: String,
#[serde(deserialize_with = "u64_from_str")]
pub leechers: u64,
#[serde(deserialize_with = "u64_from_str")]
pub seeders: u64,
#[serde(deserialize_with = "u64_from_str")]
pub num_files: u64,
#[serde(deserialize_with = "u64_from_str")]
pub size: u64,
pub username: String,
#[serde(deserialize_with = "parse_timestamp")]
pub added: chrono::DateTime<chrono::Utc>,
pub status: UserStatus,
pub category: Category,
#[serde(deserialize_with = "empty_as_none")]
pub imdb: Option<String>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum UserStatus {
Member,
Trusted,
Helper,
Vip,
Moderator,
SuperMod,
Admin,
}
#[derive(Debug, Deserialize)]
#[serde(transparent)]
pub struct Category(#[serde(deserialize_with = "u16_from_str")] pub(crate) u16);
#[derive(Debug, Deserialize)]
#[non_exhaustive]
pub struct TorrentFile {
#[serde(deserialize_with = "unit_array")]
pub name: String,
#[serde(deserialize_with = "unit_array")]
pub size: u64,
}