use serde::Deserialize;
use super::error::AniListGqlError;
#[derive(Debug, Deserialize)]
pub(crate) struct GraphQlResponse<T> {
pub data: Option<T>,
pub errors: Option<Vec<AniListGqlError>>,
}
#[derive(Debug, Deserialize)]
#[allow(dead_code)] pub struct PageInfo {
pub total: Option<i32>,
#[serde(rename = "currentPage")]
pub current_page: Option<i32>,
#[serde(rename = "lastPage")]
pub last_page: Option<i32>,
#[serde(rename = "hasNextPage")]
pub has_next_page: bool,
#[serde(rename = "perPage")]
pub per_page: Option<i32>,
}
#[derive(Debug, Deserialize)]
pub struct AniListTitle {
pub romaji: Option<String>,
pub english: Option<String>,
pub native: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct AniListDate {
pub year: Option<i32>,
pub month: Option<i32>,
pub day: Option<i32>,
}
impl AniListDate {
pub fn to_date_string(&self) -> Option<String> {
match (self.year, self.month, self.day) {
(Some(y), Some(m), Some(d)) => Some(format!("{y:04}-{m:02}-{d:02}")),
(Some(y), Some(m), None) => Some(format!("{y:04}-{m:02}")),
(Some(y), None, _) => Some(format!("{y:04}")),
_ => None,
}
}
}
#[derive(Debug, Deserialize)]
pub struct AniListCoverImage {
pub large: Option<String>,
#[serde(rename = "extraLarge")]
pub extra_large: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct AniListStudio {
pub name: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct AniListStudios {
pub nodes: Vec<AniListStudio>,
}
#[derive(Debug, Deserialize)]
#[allow(dead_code)] pub struct AniListMedia {
pub id: i32,
pub title: Option<AniListTitle>,
pub description: Option<String>,
#[serde(rename = "startDate")]
pub start_date: Option<AniListDate>,
#[serde(rename = "coverImage")]
pub cover_image: Option<AniListCoverImage>,
#[serde(rename = "bannerImage")]
pub banner_image: Option<String>,
pub genres: Option<Vec<String>>,
pub popularity: Option<i32>,
#[serde(rename = "averageScore")]
pub average_score: Option<i32>,
pub episodes: Option<i32>,
pub duration: Option<i32>,
pub status: Option<String>,
pub format: Option<String>,
#[serde(rename = "countryOfOrigin")]
pub country_of_origin: Option<String>,
#[serde(rename = "isAdult")]
pub is_adult: Option<bool>,
}
#[derive(Debug, Deserialize)]
#[allow(dead_code)] pub struct AniListMediaDetail {
pub id: i32,
pub title: Option<AniListTitle>,
pub description: Option<String>,
#[serde(rename = "startDate")]
pub start_date: Option<AniListDate>,
#[serde(rename = "endDate")]
pub end_date: Option<AniListDate>,
#[serde(rename = "coverImage")]
pub cover_image: Option<AniListCoverImage>,
#[serde(rename = "bannerImage")]
pub banner_image: Option<String>,
pub genres: Option<Vec<String>>,
pub popularity: Option<i32>,
#[serde(rename = "averageScore")]
pub average_score: Option<i32>,
pub episodes: Option<i32>,
pub duration: Option<i32>,
pub status: Option<String>,
pub format: Option<String>,
#[serde(rename = "countryOfOrigin")]
pub country_of_origin: Option<String>,
#[serde(rename = "isAdult")]
pub is_adult: Option<bool>,
pub studios: Option<AniListStudios>,
pub season: Option<String>,
#[serde(rename = "seasonYear")]
pub season_year: Option<i32>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct MediaPageResponse {
#[serde(rename = "Page")]
pub page: Option<MediaPageData>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct MediaPageData {
#[serde(rename = "pageInfo")]
pub page_info: PageInfo,
#[serde(default)]
pub media: Vec<AniListMedia>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct MediaDetailResponse {
#[serde(rename = "Media")]
pub media: Option<AniListMediaDetail>,
}
#[derive(Debug, Deserialize)]
pub struct AniListStaffName {
pub full: Option<String>,
pub native: Option<String>,
#[serde(default)]
pub alternative: Vec<String>,
}
#[derive(Debug, Deserialize)]
pub struct AniListStaffImage {
pub large: Option<String>,
}
#[derive(Debug, Deserialize)]
#[allow(dead_code)] pub struct AniListStaff {
pub id: i32,
pub name: Option<AniListStaffName>,
pub image: Option<AniListStaffImage>,
pub description: Option<String>,
#[serde(rename = "primaryOccupations")]
pub primary_occupations: Option<Vec<String>>,
#[serde(rename = "languageV2")]
pub language: Option<String>,
}
#[derive(Debug, Deserialize)]
#[allow(dead_code)] pub struct AniListStaffDetail {
pub id: i32,
pub name: Option<AniListStaffName>,
pub image: Option<AniListStaffImage>,
pub description: Option<String>,
#[serde(rename = "primaryOccupations")]
pub primary_occupations: Option<Vec<String>>,
pub gender: Option<String>,
#[serde(rename = "dateOfBirth")]
pub date_of_birth: Option<AniListDate>,
#[serde(rename = "dateOfDeath")]
pub date_of_death: Option<AniListDate>,
#[serde(rename = "homeTown")]
pub home_town: Option<String>,
#[serde(rename = "siteUrl")]
pub site_url: Option<String>,
#[serde(rename = "languageV2")]
pub language: Option<String>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct StaffPageResponse {
#[serde(rename = "Page")]
pub page: Option<StaffPageData>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct StaffPageData {
#[serde(rename = "pageInfo")]
pub page_info: PageInfo,
#[serde(default)]
pub staff: Vec<AniListStaff>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct StaffDetailResponse {
#[serde(rename = "Staff")]
pub staff: Option<AniListStaffDetail>,
}