use anyhow::Result;
use bytes::Bytes;
use reqwest::Method;
use crate::{
common::model::BangumiClient,
module::model::{Paged, SimpleImageType},
};
use super::model::{Character, CharacterPerson, CharacterSearch, CharacterSubject};
impl BangumiClient {
pub async fn search_characters(
&self,
limit: Option<u32>,
offset: Option<u32>,
payload: Option<CharacterSearch>,
) -> Result<Paged<Character>> {
let url = format!("{}/v0/search/characters", self.base_path);
let mut request_builder = self.request_builder(Method::POST, &url);
if let Some(ref param_value) = limit {
request_builder = request_builder.query(&[("limit", ¶m_value)]);
}
if let Some(ref param_value) = offset {
request_builder = request_builder.query(&[("offset", ¶m_value)]);
}
request_builder = request_builder.json(&payload);
let res = self.request_send(request_builder).await?.json().await?;
Ok(res)
}
pub async fn get_character(&self, character_id: u32) -> Result<Character> {
let url = format!("{}/v0/characters/{character_id}", self.base_path);
let request_builder = self.request_builder(Method::GET, &url);
let res = self.request_send(request_builder).await?.json().await?;
Ok(res)
}
pub async fn get_character_image(
&self,
character_id: u32,
r#type: SimpleImageType,
) -> Result<Bytes> {
let url = format!("{}/v0/characters/{character_id}/image", self.base_path);
let mut request_builder = self.request_builder(Method::GET, &url);
request_builder = request_builder.query(&[("type", &r#type)]);
let res = self.request_send(request_builder).await?.bytes().await?;
Ok(res)
}
pub async fn get_character_subjects(&self, character_id: u32) -> Result<Vec<CharacterSubject>> {
let url = format!("{}/v0/characters/{character_id}/subjects", self.base_path);
let request_builder = self.request_builder(Method::GET, &url);
let res = self.request_send(request_builder).await?.json().await?;
Ok(res)
}
pub async fn get_character_persons(&self, character_id: u32) -> Result<Vec<CharacterPerson>> {
let url = format!("{}/v0/characters/{character_id}/persons", self.base_path);
let request_builder = self.request_builder(Method::GET, &url);
let res = self.request_send(request_builder).await?.json().await?;
Ok(res)
}
pub async fn collect_character(&self, character_id: u32) -> Result<()> {
let url = format!("{}/v0/characters/{character_id}/collect", self.base_path);
let request_builder = self.request_builder(Method::POST, &url);
let _res = self.request_send(request_builder).await?;
Ok(())
}
pub async fn uncollect_character(&self, character_id: u32) -> Result<()> {
let url = format!("{}/v0/characters/{character_id}/collect", self.base_path);
let request_builder = self.request_builder(Method::DELETE, &url);
let _res = self.request_send(request_builder).await?;
Ok(())
}
}