1use crate::error::{ApiError, Result};
4use reqwest::Client;
5use serde_json::Value;
6use url::Url;
7
8pub struct StarringClient {
10 base_url: String,
11 client: Client,
12}
13
14impl StarringClient {
15 pub fn new(base_url: String, client: Client) -> Self {
17 Self { base_url, client }
18 }
19
20 pub fn with_auth(self, token: &str) -> Self {
22 self
24 }
25
26 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 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}