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 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 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}