use crate::enums::likable::LikeableType;
use crate::errors::AniListError;
use crate::objects::favourites::Favourites;
use crate::objects::user::User;
use crate::unions::likeable::LikeableUnion;
use crate::{client::AniListClient, queries::common};
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
#[derive(Serialize)]
pub struct ToggleLikeOptions {
pub id: i32,
#[serde(rename = "type")]
pub like_type: LikeableType,
}
#[derive(Default, Debug, Serialize, Deserialize)]
pub struct ToggleFollowOptions {
#[serde(rename = "userId")]
pub user_id: i32,
}
#[skip_serializing_none]
#[derive(Default, Debug, Serialize, Deserialize)]
pub struct ToggleFavouriteOptions {
#[serde(rename = "animeId")]
pub anime_id: Option<i32>,
#[serde(rename = "mangaId")]
pub manga_id: Option<i32>,
#[serde(rename = "characterId")]
pub character_id: Option<i32>,
#[serde(rename = "staffId")]
pub staff_id: Option<i32>,
#[serde(rename = "studioId")]
pub studio_id: Option<i32>,
}
pub struct CommonEndpoint {
pub client: AniListClient,
}
impl CommonEndpoint {
pub fn new(client: AniListClient) -> Self {
Self { client }
}
pub async fn toggle_like(
&self,
options: &ToggleLikeOptions,
) -> Result<LikeableUnion, AniListError> {
let query = common::TOGGLE_LIKE;
self.client.fetch(query, Some(options)).await
}
pub async fn toggle_follow(&self, options: &ToggleFollowOptions) -> Result<User, AniListError> {
let query = common::TOGGLE_FOLLOW;
self.client.fetch(query, Some(options)).await
}
pub async fn toggle_favourite(
&self,
options: &ToggleFavouriteOptions,
) -> Result<Favourites, AniListError> {
let query = common::TOGGLE_FAVOURITE;
self.client.fetch(query, Some(options)).await
}
pub async fn like_activity(&self, id: i32) -> Result<LikeableUnion, AniListError> {
self.toggle_like(&ToggleLikeOptions {
id,
like_type: LikeableType::Activity,
})
.await
}
pub async fn like_activity_reply(&self, id: i32) -> Result<LikeableUnion, AniListError> {
self.toggle_like(&ToggleLikeOptions {
id,
like_type: LikeableType::ActivityReply,
})
.await
}
pub async fn like_thread(&self, id: i32) -> Result<LikeableUnion, AniListError> {
self.toggle_like(&ToggleLikeOptions {
id,
like_type: LikeableType::Thread,
})
.await
}
pub async fn like_thread_comment(&self, id: i32) -> Result<LikeableUnion, AniListError> {
self.toggle_like(&ToggleLikeOptions {
id,
like_type: LikeableType::ThreadComment,
})
.await
}
pub async fn follow_user(&self, user_id: i32) -> Result<User, AniListError> {
self.toggle_follow(&ToggleFollowOptions { user_id }).await
}
pub async fn favourite_anime(&self, anime_id: i32) -> Result<Favourites, AniListError> {
self.toggle_favourite(&ToggleFavouriteOptions {
anime_id: Some(anime_id),
..Default::default()
})
.await
}
pub async fn favourite_manga(&self, manga_id: i32) -> Result<Favourites, AniListError> {
self.toggle_favourite(&ToggleFavouriteOptions {
manga_id: Some(manga_id),
..Default::default()
})
.await
}
pub async fn favourite_character(&self, character_id: i32) -> Result<Favourites, AniListError> {
self.toggle_favourite(&ToggleFavouriteOptions {
character_id: Some(character_id),
..Default::default()
})
.await
}
pub async fn favourite_staff(&self, staff_id: i32) -> Result<Favourites, AniListError> {
self.toggle_favourite(&ToggleFavouriteOptions {
staff_id: Some(staff_id),
..Default::default()
})
.await
}
pub async fn favourite_studio(&self, studio_id: i32) -> Result<Favourites, AniListError> {
self.toggle_favourite(&ToggleFavouriteOptions {
studio_id: Some(studio_id),
..Default::default()
})
.await
}
}