use crate::enums::character::CharacterSort;
use crate::enums::media::MediaSort;
use crate::errors::AniListError;
use crate::objects::character::Character;
use crate::objects::responses::Page;
use crate::{client::AniListClient, queries::character};
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
#[skip_serializing_none]
#[derive(Default, Debug, Serialize, Deserialize)]
pub struct FetchCharacterOptions {
pub page: Option<i32>,
pub id: Option<i32>,
#[serde(rename = "perPage")]
pub per_page: Option<i32>,
pub search: Option<String>,
pub sort: Option<Vec<CharacterSort>>,
#[serde(rename = "isBirthday")]
pub is_birthday: Option<bool>,
pub id_not: Option<i32>,
pub id_in: Option<Vec<i32>>,
pub id_not_in: Option<Vec<i32>>,
#[serde(rename = "includeMedia")]
pub include_media: Option<bool>,
#[serde(rename = "includeModNotes")]
pub include_mod_notes: Option<bool>,
#[serde(rename = "mediaSort")]
pub media_sort: Option<Vec<MediaSort>>,
#[serde(rename = "mediaPage")]
pub media_page: Option<i32>,
#[serde(rename = "mediaPerPage")]
pub media_per_page: Option<i32>,
}
#[skip_serializing_none]
#[derive(Default, Debug, Serialize, Deserialize)]
pub struct FetchCharacterOneOptions {
pub id: Option<i32>,
#[serde(rename = "isBirthday")]
pub is_birthday: Option<bool>,
pub search: Option<String>,
pub id_not: Option<i32>,
pub id_in: Option<Vec<i32>>,
pub id_not_in: Option<Vec<i32>>,
pub sort: Option<Vec<CharacterSort>>,
pub page: Option<i32>,
#[serde(rename = "perPage")]
pub per_page: Option<i32>,
#[serde(rename = "mediaSort")]
pub media_sort: Option<Vec<MediaSort>>,
#[serde(rename = "mediaPage")]
pub media_page: Option<i32>,
#[serde(rename = "mediaPerPage")]
pub media_per_page: Option<i32>,
}
pub struct CharacterEndpoint {
client: AniListClient,
}
impl CharacterEndpoint {
pub fn new(client: AniListClient) -> Self {
Self { client }
}
pub async fn fetch(
&self,
options: &FetchCharacterOptions,
) -> Result<Page<Vec<Character>>, AniListError> {
let query = character::FETCH;
self.client.fetch(query, Some(options)).await
}
pub async fn fetch_one(
&self,
options: &FetchCharacterOneOptions,
) -> Result<Character, AniListError> {
let query = character::FETCH_ONE;
self.client.fetch(query, Some(options)).await
}
pub async fn get_popular(
&self,
page: Option<i32>,
per_page: Option<i32>,
) -> Result<Page<Vec<Character>>, AniListError> {
self.fetch(&FetchCharacterOptions {
page,
per_page,
sort: Some(vec![CharacterSort::FavouritesDesc]),
..Default::default()
})
.await
}
pub async fn get_most_favorited(
&self,
page: Option<i32>,
per_page: Option<i32>,
) -> Result<Page<Vec<Character>>, AniListError> {
self.get_popular(page, per_page).await
}
pub async fn search(
&self,
query: &str,
page: Option<i32>,
per_page: Option<i32>,
) -> Result<Page<Vec<Character>>, AniListError> {
self.fetch(&FetchCharacterOptions {
search: Some(query.to_string()),
page,
per_page,
sort: Some(vec![CharacterSort::SearchMatch]),
..Default::default()
})
.await
}
pub async fn get_by_id(&self, id: i32) -> Result<Character, AniListError> {
self.fetch_one(&FetchCharacterOneOptions {
id: Some(id),
..Default::default()
})
.await
}
pub async fn get_today_birthday(
&self,
page: Option<i32>,
per_page: Option<i32>,
) -> Result<Page<Vec<Character>>, AniListError> {
self.fetch(&FetchCharacterOptions {
is_birthday: Some(true),
page,
per_page,
sort: Some(vec![CharacterSort::FavouritesDesc]),
..Default::default()
})
.await
}
}