bangumi_api/module/character/
service.rs1use anyhow::Result;
2use bytes::Bytes;
3use reqwest::Method;
4
5use crate::{
6 common::model::BangumiClient,
7 module::model::{Paged, SimpleImageType},
8};
9
10use super::model::{Character, CharacterPerson, CharacterSearch, CharacterSubject};
11
12impl BangumiClient {
13 pub async fn search_characters(
25 &self,
26 limit: Option<u32>,
27 offset: Option<u32>,
28 payload: Option<CharacterSearch>,
29 ) -> Result<Paged<Character>> {
30 let url = format!("{}/v0/search/characters", self.base_path);
31
32 let mut request_builder = self.request_builder(Method::POST, &url);
33
34 if let Some(ref param_value) = limit {
36 request_builder = request_builder.query(&[("limit", ¶m_value)]);
37 }
38 if let Some(ref param_value) = offset {
39 request_builder = request_builder.query(&[("offset", ¶m_value)]);
40 }
41 request_builder = request_builder.json(&payload);
43
44 let res = self.request_send(request_builder).await?.json().await?;
46
47 Ok(res)
48 }
49
50 pub async fn get_character(&self, character_id: u32) -> Result<Character> {
60 let url = format!("{}/v0/characters/{character_id}", self.base_path);
61
62 let request_builder = self.request_builder(Method::GET, &url);
63
64 let res = self.request_send(request_builder).await?.json().await?;
66
67 Ok(res)
68 }
69
70 pub async fn get_character_image(
81 &self,
82 character_id: u32,
83 r#type: SimpleImageType,
84 ) -> Result<Bytes> {
85 let url = format!("{}/v0/characters/{character_id}/image", self.base_path);
86
87 let mut request_builder = self.request_builder(Method::GET, &url);
88 request_builder = request_builder.query(&[("type", &r#type)]);
90
91 let res = self.request_send(request_builder).await?.bytes().await?;
93
94 Ok(res)
95 }
96
97 pub async fn get_character_subjects(&self, character_id: u32) -> Result<Vec<CharacterSubject>> {
107 let url = format!("{}/v0/characters/{character_id}/subjects", self.base_path);
108
109 let request_builder = self.request_builder(Method::GET, &url);
110
111 let res = self.request_send(request_builder).await?.json().await?;
113
114 Ok(res)
115 }
116
117 pub async fn get_character_persons(&self, character_id: u32) -> Result<Vec<CharacterPerson>> {
127 let url = format!("{}/v0/characters/{character_id}/persons", self.base_path);
128
129 let request_builder = self.request_builder(Method::GET, &url);
130
131 let res = self.request_send(request_builder).await?.json().await?;
133
134 Ok(res)
135 }
136
137 pub async fn collect_character(&self, character_id: u32) -> Result<()> {
147 let url = format!("{}/v0/characters/{character_id}/collect", self.base_path);
148
149 let request_builder = self.request_builder(Method::POST, &url);
150
151 let _res = self.request_send(request_builder).await?;
153
154 Ok(())
155 }
156
157 pub async fn uncollect_character(&self, character_id: u32) -> Result<()> {
167 let url = format!("{}/v0/characters/{character_id}/collect", self.base_path);
168
169 let request_builder = self.request_builder(Method::DELETE, &url);
170
171 let _res = self.request_send(request_builder).await?;
173
174 Ok(())
175 }
176}