gitea_sdk/api/user/
starred.rs

1use build_it::Builder;
2use reqwest::StatusCode;
3use serde::Serialize;
4
5use crate::{error::Result, model::repos::Repository, Client};
6
7#[derive(Default, Debug, Clone, Serialize, Builder)]
8pub struct ListStarredBuilder {
9    /// Page number of the results to return (1-based).
10    page: Option<i64>,
11    /// Page size of results
12    limit: Option<i64>,
13}
14
15#[derive(Debug, Clone)]
16pub struct StarRepoBuilder {
17    owner: String,
18    repo: String,
19}
20
21#[derive(Debug, Clone)]
22pub struct UnstarRepoBuilder {
23    owner: String,
24    repo: String,
25}
26
27#[derive(Debug, Clone)]
28pub struct IsStarredBuilder {
29    owner: String,
30    repo: String,
31}
32
33impl ListStarredBuilder {
34    pub fn new() -> Self {
35        Self::default()
36    }
37
38    /// Sends the request to list the user's starred repos.
39    pub async fn send(&self, client: &Client) -> Result<Vec<Repository>> {
40        let req = client.get("/user/starred").query(self).build()?;
41        let res = client.make_request(req).await?;
42        client.parse_response(res).await
43    }
44}
45
46impl StarRepoBuilder {
47    pub fn new(owner: impl ToString, repo: impl ToString) -> Self {
48        Self {
49            owner: owner.to_string(),
50            repo: repo.to_string(),
51        }
52    }
53
54    /// Sends the request to star the repo.
55    pub async fn send(&self, client: &Client) -> Result<()> {
56        let Self { owner, repo } = self;
57        let req = client
58            .put(format!("/user/starred/{owner}/{repo}"))
59            .build()?;
60        let _ = client.make_request(req).await?;
61        Ok(())
62    }
63}
64
65impl UnstarRepoBuilder {
66    pub fn new(owner: impl ToString, repo: impl ToString) -> Self {
67        Self {
68            owner: owner.to_string(),
69            repo: repo.to_string(),
70        }
71    }
72
73    /// Sends the request to star the repo.
74    pub async fn send(&self, client: &Client) -> Result<()> {
75        let Self { owner, repo } = self;
76        let req = client
77            .delete(format!("/user/starred/{owner}/{repo}"))
78            .build()?;
79        let _ = client.make_request(req).await?;
80        Ok(())
81    }
82}
83
84impl IsStarredBuilder {
85    pub fn new(owner: impl ToString, repo: impl ToString) -> Self {
86        Self {
87            owner: owner.to_string(),
88            repo: repo.to_string(),
89        }
90    }
91
92    /// Sends the request to star the repo.
93    pub async fn send(&self, client: &Client) -> Result<bool> {
94        let Self { owner, repo } = self;
95        let req = client
96            .get(format!("/user/starred/{owner}/{repo}"))
97            .build()?;
98        match client.make_request(req).await {
99            Ok(_) => Ok(true),
100            Err(e) => {
101                if e.status_code == StatusCode::NOT_FOUND {
102                    Ok(false)
103                } else {
104                    Err(e)
105                }
106            }
107        }
108    }
109}