rust_cnb/
starring.rs

1//! Starring API 客户端
2
3use crate::error::{ApiError, Result};
4use reqwest::Client;
5use serde_json::Value;
6use url::Url;
7
8/// Starring API 客户端
9pub struct StarringClient {
10    base_url: String,
11    client: Client,
12}
13
14impl StarringClient {
15    /// 创建新的 Starring API 客户端
16    pub fn new(base_url: String, client: Client) -> Self {
17        Self { base_url, client }
18    }
19
20    /// 设置认证信息
21    pub fn with_auth(self, token: &str) -> Self {
22        // 这里可以扩展认证逻辑
23        self
24    }
25
26    /// 获取指定仓库的star用户列表。Get the list of users who starred the specified repository.
27    pub async fn get_repo_stars(
28        &self,
29        repo: String,
30        filter_type: String,
31        page: i64,
32        page_size: i64,
33    ) -> Result<Value> {
34        let path = format!("/{}/-/stars", repo);
35        let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
36        
37        url.query_pairs_mut().append_pair("filter_type", &filter_type.to_string());
38        url.query_pairs_mut().append_pair("page", &page.to_string());
39        url.query_pairs_mut().append_pair("page_size", &page_size.to_string());
40
41                let request = self.client.request(
42            reqwest::Method::GET,
43            url
44        );
45        
46
47
48
49        let response = request.send().await?;
50        
51        if response.status().is_success() {
52            let json: Value = response.json().await?;
53            Ok(json)
54        } else {
55            Err(ApiError::HttpError(response.status().as_u16()))
56        }
57    }
58
59    /// 获取指定用户的 star 仓库列表。Get the list of repositories starred by the specified user.
60    pub async fn get_users_username_stared_repos(
61        &self,
62        username: String,
63        search: Option<String>,
64        page: Option<i64>,
65        page_size: Option<i64>,
66        desc: Option<bool>,
67        order_by: Option<String>,
68    ) -> Result<Value> {
69        let path = format!("/users/{}/stared-repos", username);
70        let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
71        
72        if let Some(value) = search {
73            url.query_pairs_mut().append_pair("search", &value.to_string());
74        }
75        if let Some(value) = page {
76            url.query_pairs_mut().append_pair("page", &value.to_string());
77        }
78        if let Some(value) = page_size {
79            url.query_pairs_mut().append_pair("page_size", &value.to_string());
80        }
81        if let Some(value) = desc {
82            url.query_pairs_mut().append_pair("desc", &value.to_string());
83        }
84        if let Some(value) = order_by {
85            url.query_pairs_mut().append_pair("order_by", &value.to_string());
86        }
87
88                let request = self.client.request(
89            reqwest::Method::GET,
90            url
91        );
92        
93
94
95
96        let response = request.send().await?;
97        
98        if response.status().is_success() {
99            let json: Value = response.json().await?;
100            Ok(json)
101        } else {
102            Err(ApiError::HttpError(response.status().as_u16()))
103        }
104    }
105
106}