r621 0.3.3

Provides a client to access e621
Documentation
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,

    // Not documented?
    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
}