use anyhow::Result;
use bytes::Bytes;
use reqwest::Method;
use crate::{
common::model::BangumiClient,
module::model::{ImageType, Paged},
};
use super::model::{
DailyCalendarItem, Subject, SubjectBrowseSort, SubjectCategory, SubjectCharacter,
SubjectPerson, SubjectSearch, SubjectSubject, SubjectType,
};
impl BangumiClient {
pub async fn get_calendar(&self) -> Result<Vec<DailyCalendarItem>> {
let url = format!("{}/calendar", 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 search_subjects(
&self,
limit: Option<u32>,
offset: Option<u32>,
payload: Option<SubjectSearch>,
) -> Result<Paged<Subject>> {
let url = format!("{}/v0/search/subjects", self.base_path);
let mut request_builder = self.request_builder(Method::POST, &url);
if let Some(ref limit) = limit {
request_builder = request_builder.query(&[("limit", limit)]);
}
if let Some(ref offset) = offset {
request_builder = request_builder.query(&[("offset", offset)]);
}
let request_builder = request_builder.json(&payload);
let res = self.request_send(request_builder).await?.json().await?;
Ok(res)
}
pub async fn get_subjects(
&self,
r#type: SubjectType,
cat: Option<SubjectCategory>,
series: Option<bool>,
platform: Option<&str>,
sort: Option<SubjectBrowseSort>,
year: Option<u32>,
month: Option<u32>,
limit: Option<u32>,
offset: Option<u32>,
) -> Result<Paged<Subject>> {
let url = format!("{}/v0/subjects", self.base_path);
let mut req_builder = self.request_builder(reqwest::Method::GET, &url);
req_builder = req_builder.query(&[("type", &r#type)]);
if let Some(ref param_value) = cat {
req_builder = req_builder.query(&[("cat", ¶m_value)]);
}
if let Some(ref param_value) = series {
req_builder = req_builder.query(&[("series", ¶m_value)]);
}
if let Some(ref param_value) = platform {
req_builder = req_builder.query(&[("platform", ¶m_value)]);
}
if let Some(ref param_value) = sort {
req_builder = req_builder.query(&[("sort", ¶m_value)]);
}
if let Some(ref param_value) = year {
req_builder = req_builder.query(&[("year", ¶m_value)]);
}
if let Some(ref param_value) = month {
req_builder = req_builder.query(&[("month", ¶m_value)]);
}
if let Some(ref param_value) = limit {
req_builder = req_builder.query(&[("limit", ¶m_value)]);
}
if let Some(ref param_value) = offset {
req_builder = req_builder.query(&[("offset", ¶m_value)]);
}
let res = self.request_send(req_builder).await?.json().await?;
Ok(res)
}
pub async fn get_subject(&self, subject_id: u32) -> Result<Subject> {
let url = format!("{}/v0/subjects/{subject_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_subject_image(&self, subject_id: u32, r#type: ImageType) -> Result<Bytes> {
let url = format!("{}/v0/subjects/{subject_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_subject_persons(&self, subject_id: u32) -> Result<Vec<SubjectPerson>> {
let url = format!("{}/v0/subjects/{subject_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 get_subject_characters(&self, subject_id: u32) -> Result<Vec<SubjectCharacter>> {
let url = format!("{}/v0/subjects/{subject_id}/characters", 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_subject_subjects(&self, subject_id: u32) -> Result<Vec<SubjectSubject>> {
let url = format!("{}/v0/subjects/{subject_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)
}
}