use serde::{Deserialize, Serialize};
use crate::{FileSize, Id, ImageDimension, VoteCount};
use crate::serde_helper::{deserialize_empty_object};
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct RawPost {
#[serde(alias = "post")]
inner: Post,
}
impl Into<Post> for RawPost {
fn into(self) -> Post {
self.inner
}
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct RawPosts {
#[serde(alias = "posts")]
inner: Vec<Post>,
}
impl Into<Vec<Post>> for RawPosts {
fn into(self) -> Vec<Post> {
self.inner
}
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Post {
pub id: Id,
pub created_at: String,
pub updated_at: String,
pub file: PostFile,
pub preview: PostPreview,
pub sample: PostSample,
pub score: PostScore,
pub tags: PostTags,
pub locked_tags: Vec<String>,
pub change_seq: Option<u128>,
pub flags: PostFlags,
pub rating: String,
pub fav_count: u16,
pub sources: Vec<String>,
pub pools: Vec<Id>,
pub relationships: PostRelationships,
pub approver_id: Option<Id>,
pub uploader_id: Id,
pub description: String,
pub comment_count: u16,
pub is_favorited: bool,
pub has_notes: bool
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct PostTags {
pub artist: Vec<String>,
pub character: Vec<String>,
pub copyright: Vec<String>,
pub general: Vec<String>,
pub invalid: Vec<String>,
pub lore: Vec<String>,
pub meta: Vec<String>,
pub species: Vec<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct PostFile {
pub width: ImageDimension,
pub height: ImageDimension,
pub ext: String,
pub size: FileSize,
pub md5: String,
pub url: String,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct PostPreview {
pub width: ImageDimension,
pub height: ImageDimension,
pub url: String
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct PostSample {
pub has: bool,
pub width: ImageDimension,
pub height: ImageDimension,
pub url: Option<String>,
pub alt: Option<String>,
#[serde(deserialize_with = "deserialize_empty_object")]
pub alternates: Option<PostSampleAlternates>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct PostSampleAlternates {
pub has: bool,
pub original: Option<AlternativeMedia>,
pub variants: Option<PostSampleAlternatesVariants>,
pub samples: Option<PostSampleAlternatesSamples>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct PostSampleAlternatesVariants {
pub mp4: Option<AlternativeMedia>
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct PostSampleAlternatesSamples {
#[serde(rename = "480p")]
pub resolution480p: Option<AlternativeMedia>,
#[serde(rename = "720p")]
pub resolution720p: Option<AlternativeMedia>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AlternativeMedia {
pub fps: f64,
pub codec: String,
pub size: FileSize,
pub width: ImageDimension,
pub height: ImageDimension,
pub url: String
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct PostScore {
pub up: VoteCount,
pub down: VoteCount,
pub total: VoteCount,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct PostRelationships {
pub parent_id: Option<Id>,
pub has_children: bool,
pub has_active_children: bool,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct PostFlags {
pub pending: bool,
pub flagged: bool,
pub note_locked: bool,
pub status_locked: bool,
pub rating_locked: bool,
pub deleted: bool
}