Skip to main content

gitee_rs/releases/
mod.rs

1use crate::{error::GiteeError, GiteeClient};
2use reqwest::Method;
3use serde::{Deserialize, Serialize};
4use crate::utils::deserialize_string_or_int;
5
6#[derive(Debug, Clone, Deserialize, Serialize)]
7pub struct Release {
8    #[serde(deserialize_with = "deserialize_string_or_int")]
9    pub id: String,
10    pub tag_name: String,
11    pub target_commitish: String,
12    pub name: String,
13    pub body: Option<String>,
14    pub draft: bool,
15    pub prerelease: bool,
16    pub created_at: String,
17    pub published_at: String,
18}
19
20impl GiteeClient {
21    /// Create a release
22    pub async fn create_release(&self, owner: &str, repo: &str, tag_name: &str, name: &str, body: Option<&str>) -> Result<Release, GiteeError> {
23        let url = format!("{}/repos/{}/{}/releases", self.base_url(), owner, repo);
24
25        let mut payload = std::collections::HashMap::new();
26        payload.insert("tag_name", tag_name.to_string());
27        payload.insert("name", name.to_string());
28        if let Some(body) = body {
29            payload.insert("body", body.to_string());
30        }
31
32        let response = self
33            .client()
34            .request(Method::POST, &url)
35            .header("Authorization", self.auth_header())
36            .json(&payload)
37            .send()
38            .await?;
39
40        if !response.status().is_success() {
41            return Err(GiteeError::ApiError(format!(
42                "Failed to create release: {}",
43                response.status()
44            )));
45        }
46
47        let release: Release = response.json().await?;
48        Ok(release)
49    }
50
51    /// List releases
52    pub async fn list_releases(&self, owner: &str, repo: &str) -> Result<Vec<Release>, GiteeError> {
53        let url = format!("{}/repos/{}/{}/releases", self.base_url(), owner, repo);
54        let response = self
55            .client()
56            .request(Method::GET, &url)
57            .header("Authorization", self.auth_header())
58            .send()
59            .await?;
60
61        if !response.status().is_success() {
62            return Err(GiteeError::ApiError(format!(
63                "Failed to list releases: {}",
64                response.status()
65            )));
66        }
67
68        let releases: Vec<Release> = response.json().await?;
69        Ok(releases)
70    }
71}