Skip to main content

pickcat_api_collection/
tag.rs

1//! 分区标签章节。
2//!
3//! 参见 <https://pickcat-docs.xiaole6324.fun/tag.html>。
4
5use crate::dto::tag::{TagSidebarLinksDTO, TagsDTO};
6use crate::{Error, PickcatAccound};
7
8/// 分区(标签)接口,来自文档的「分区标签」章节
9/// (<https://pickcat-docs.xiaole6324.fun/tag.html>)。
10pub trait TagBehavior {
11    /// `GET /api/v1/tags` —— 公开。`assignable = true` 时只返回可发帖分区。
12    fn list_tags(
13        &self,
14        assignable: Option<bool>,
15    ) -> impl std::future::Future<Output = Result<TagsDTO, Error>> + Send;
16
17    /// `GET /api/v1/tags/{slug}/sidebar-links` —— 公开。
18    fn get_tag_sidebar_links(
19        &self,
20        slug: &str,
21    ) -> impl std::future::Future<Output = Result<TagSidebarLinksDTO, Error>> + Send;
22}
23
24impl TagBehavior for PickcatAccound {
25    async fn list_tags(&self, assignable: Option<bool>) -> Result<TagsDTO, Error> {
26        let mut request = self.client.get(format!("{}/api/v1/tags", self.base_url));
27        if let Some(assignable) = assignable {
28            request = request.query(&[("assignable", assignable)]);
29        }
30        Ok(request.send().await?.json::<TagsDTO>().await?)
31    }
32
33    async fn get_tag_sidebar_links(&self, slug: &str) -> Result<TagSidebarLinksDTO, Error> {
34        Ok(self
35            .client
36            .get(format!(
37                "{}/api/v1/tags/{}/sidebar-links",
38                self.base_url, slug
39            ))
40            .send()
41            .await?
42            .json::<TagSidebarLinksDTO>()
43            .await?)
44    }
45}