anilist_moe 0.4.0

Anilist_Moe is a Rust Wrapper for the Anilist API. This library allows you to seamlessly interact with Anilist's Public API with and without authentication. This currently supports Anime, Manga, Users, Staff, Forum, Threads, Recommendations, Reviews and User Activities
Documentation
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;

use crate::{
    enums::{
        character::CharacterRole,
        external_link::ExternalLinkType,
        media::{
            CountryCode, MediaFormat, MediaRankType, MediaRelation, MediaSeason, MediaSource,
            MediaStatus, MediaType,
        },
        submission::SubmissionStatus,
    },
    objects::{
        airing::{AiringSchedule, AiringScheduleConnection},
        character::{Character, CharacterConnection},
        common::{FuzzyDate, Json, PageInfo},
        media_list::MediaList,
        recommendation::RecommendationConnection,
        review::ReviewConnection,
        staff::{Staff, StaffConnection, StaffEdge, StaffRoleType},
        stats::MediaStats,
        studio::{Studio, StudioConnection, StudioEdge},
        user::User,
    },
};

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Media {
    pub id: Option<i32>,
    pub id_mal: Option<i32>,
    pub title: Option<MediaTitle>,
    #[serde(rename = "type")]
    pub media_type: Option<MediaType>,
    pub format: Option<MediaFormat>,
    pub status: Option<MediaStatus>,
    pub description: Option<String>,
    pub start_date: Option<FuzzyDate>,
    pub end_date: Option<FuzzyDate>,
    pub season: Option<MediaSeason>,
    pub season_year: Option<i32>,
    pub season_int: Option<i32>,
    pub episodes: Option<i32>,
    pub duration: Option<i32>,
    pub chapters: Option<i32>,
    pub volumes: Option<i32>,
    pub country_of_origin: Option<CountryCode>,
    pub is_licensed: Option<bool>,
    pub source: Option<MediaSource>,
    pub hashtag: Option<String>,
    pub trailer: Option<MediaTrailer>,
    pub updated_at: Option<i32>,
    pub cover_image: Option<MediaCoverImage>,
    pub banner_image: Option<String>,
    pub genres: Option<Vec<String>>,
    pub synonyms: Option<Vec<String>>,
    pub average_score: Option<i32>,
    pub mean_score: Option<i32>,
    pub popularity: Option<i32>,
    pub is_locked: Option<bool>,
    pub trending: Option<i32>,
    pub favourites: Option<i32>,
    pub tags: Option<Vec<MediaTag>>,
    pub relations: Option<MediaConnection>,
    pub characters: Option<CharacterConnection>,
    pub staff: Option<StaffConnection>,
    pub studios: Option<StudioConnection>,
    #[serde(rename = "fullStudios")]
    pub studios_full: Option<StudioConnection>,
    pub is_favourite: Option<bool>,
    pub is_favourite_blocked: Option<bool>,
    pub is_adult: Option<bool>,
    pub next_airing_episode: Option<AiringSchedule>,
    pub airing_schedule: Option<AiringScheduleConnection>,
    pub trends: Option<MediaTrendConnection>,
    pub external_links: Option<Vec<MediaExternalLink>>,
    pub streaming_episodes: Option<Vec<MediaStreamingEpisode>>,
    pub rankings: Option<Vec<MediaRank>>,
    pub media_list_entry: Option<Box<MediaList>>,
    pub reviews: Option<ReviewConnection>,
    pub recommendations: Option<RecommendationConnection>,
    pub stats: Option<MediaStats>,
    pub site_url: Option<String>,
    pub auto_create_forum_thread: Option<bool>,
    pub is_recommendation_blocked: Option<bool>,
    pub is_review_blocked: Option<bool>,
    pub mod_notes: Option<String>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaCharacter {
    pub id: Option<i32>,
    pub role: Option<CharacterRole>,
    pub role_notes: Option<String>,
    pub dub_group: Option<String>,
    pub character_name: Option<String>,
    pub character: Option<Character>,
    pub voice_actor: Option<Staff>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaConnection {
    pub edges: Option<Vec<MediaEdge>>,
    pub nodes: Option<Vec<Media>>,
    pub page_info: Option<PageInfo>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaCoverImage {
    pub extra_large: Option<String>,
    pub large: Option<String>,
    pub medium: Option<String>,
    pub color: Option<String>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaEdge {
    pub node: Option<Media>,
    pub id: Option<i32>,
    pub relation_type: Option<MediaRelation>,
    pub is_main_studio: Option<bool>,
    pub characters: Option<Vec<Character>>,
    pub character_role: Option<CharacterRole>,
    pub character_name: Option<String>,
    pub role_notes: Option<String>,
    pub dub_group: Option<String>,
    pub staff_role: Option<String>,
    pub voice_actors: Option<Vec<Staff>>,
    pub voice_actor_roles: Option<Vec<StaffRoleType>>,
    pub favourite_order: Option<i32>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaExternalLink {
    pub id: i32,
    pub url: Option<String>,
    pub site: Option<String>,
    pub site_id: Option<i32>,
    #[serde(rename = "type")]
    pub link_type: Option<ExternalLinkType>,
    pub language: Option<String>,
    pub color: Option<String>,
    pub icon: Option<String>,
    pub notes: Option<String>,
    pub is_disabled: Option<bool>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaRank {
    pub id: i32,
    pub rank: Option<i32>,
    #[serde(rename = "type")]
    pub rank_type: Option<MediaRankType>,
    pub format: Option<MediaFormat>,
    pub year: Option<i32>,
    pub season: Option<MediaSeason>,
    pub all_time: Option<bool>,
    pub context: Option<String>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaStreamingEpisode {
    pub title: Option<String>,
    pub thumbnail: Option<String>,
    pub url: Option<String>,
    pub site: Option<String>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaSubmission {
    pub id: i32,
    pub submitter: Option<User>,
    pub assignee: Option<User>,
    pub status: Option<SubmissionStatus>,
    pub submitter_stats: Option<Json>,
    pub notes: Option<String>,
    pub source: Option<String>,
    pub changes: Option<Vec<String>>,
    pub locked: Option<bool>,
    pub media: Option<Media>,
    pub submission: Option<Media>,
    pub characters: Option<Vec<MediaSubmissionComparison>>,
    pub staff: Option<Vec<MediaSubmissionComparison>>,
    pub studios: Option<Vec<MediaSubmissionComparison>>,
    pub relations: Option<Vec<MediaEdge>>,
    pub external_links: Option<Vec<MediaSubmissionComparison>>,
    pub created_at: Option<i32>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaSubmissionComparison {
    pub submission: Option<MediaSubmissionEdge>,
    pub character: Option<MediaCharacter>,
    pub staff: Option<StaffEdge>,
    pub studio: Option<StudioEdge>,
    pub external_link: Option<MediaExternalLink>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaSubmissionEdge {
    pub id: i32,
    pub character_role: Option<CharacterRole>,
    pub staff_role: Option<String>,
    pub role_notes: Option<String>,
    pub dub_group: Option<String>,
    pub character_name: Option<String>,
    pub is_main: Option<bool>,
    pub character: Option<Character>,
    pub character_submission: Option<Character>,
    pub voice_actor: Option<Staff>,
    pub voice_actor_submission: Option<Staff>,
    pub staff: Option<Staff>,
    pub staff_submission: Option<Staff>,
    pub studio: Option<Studio>,
    pub external_link: Option<MediaExternalLink>,
    pub media: Option<Media>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaTag {
    pub id: i32,
    pub name: Option<String>,
    pub description: Option<String>,
    pub category: Option<String>,
    pub rank: Option<i32>,
    pub is_general_spoiler: Option<bool>,
    pub is_media_spoiler: Option<bool>,
    pub is_adult: Option<bool>,
    pub user_id: Option<i32>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaTitle {
    pub romaji: Option<String>,
    pub english: Option<String>,
    pub native: Option<String>,
    pub user_preferred: Option<String>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaTrailer {
    pub id: Option<String>,
    pub site: Option<String>,
    pub thumbnail: Option<String>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaTrend {
    pub media_id: Option<i32>,
    pub date: Option<i32>,
    pub trending: Option<i32>,
    pub average_score: Option<i32>,
    pub popularity: Option<i32>,
    pub in_progress: Option<i32>,
    pub releasing: Option<bool>,
    pub episode: Option<i32>,
    pub media: Option<Media>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaTrendConnection {
    pub edges: Option<Vec<MediaTrendEdge>>,
    pub nodes: Option<Vec<MediaTrend>>,
    pub page_info: Option<PageInfo>,
}

#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaTrendEdge {
    pub node: Option<MediaTrend>,
}