1use crate::client::{Client, decode_response, handle_empty_response};
4use crate::errors::Error;
5use crate::types::*;
6
7impl Client {
8 pub async fn list_releases(
10 &self,
11 owner: &str,
12 repo: &str,
13 opts: Option<&QueryOptions>,
14 ) -> Result<Vec<Release>, Error> {
15 let path = format!("/repos/{}/{}/releases", owner, repo);
16 let resp = self.send_get(&path, opts).await?;
17 decode_response(resp).await
18 }
19
20 pub async fn create_releases(
22 &self,
23 owner: &str,
24 repo: &str,
25 params: &CreateReleaseParams,
26 ) -> Result<Release, Error> {
27 let path = format!("/repos/{}/{}/releases", owner, repo);
28 let resp = self.send_post(&path, Some(params)).await?;
29 decode_response(resp).await
30 }
31
32 pub async fn get_by_tag(&self, owner: &str, repo: &str, tag: &str) -> Result<Release, Error> {
34 let path = format!("/repos/{}/{}/releases/tags/{}", owner, repo, tag);
35 let resp = self.send_get(&path, None).await?;
36 decode_response(resp).await
37 }
38
39 pub async fn delete_by_tag(&self, owner: &str, repo: &str, tag: &str) -> Result<(), Error> {
41 let path = format!("/repos/{}/{}/releases/tags/{}", owner, repo, tag);
42 let resp = self.send_delete(&path, Option::<&()>::None).await?;
43 handle_empty_response(resp).await
44 }
45
46 pub async fn get_releases(
48 &self,
49 owner: &str,
50 repo: &str,
51 release_id: &str,
52 ) -> Result<Release, Error> {
53 let path = format!("/repos/{}/{}/releases/{}", owner, repo, release_id);
54 let resp = self.send_get(&path, None).await?;
55 decode_response(resp).await
56 }
57
58 pub async fn update_releases(
60 &self,
61 owner: &str,
62 repo: &str,
63 release_id: &str,
64 params: &UpdateReleaseParams,
65 ) -> Result<Release, Error> {
66 let path = format!("/repos/{}/{}/releases/{}", owner, repo, release_id);
67 let resp = self.send_patch(&path, Some(params)).await?;
68 decode_response(resp).await
69 }
70
71 pub async fn delete_releases(
73 &self,
74 owner: &str,
75 repo: &str,
76 release_id: &str,
77 ) -> Result<(), Error> {
78 let path = format!("/repos/{}/{}/releases/{}", owner, repo, release_id);
79 let resp = self.send_delete(&path, Option::<&()>::None).await?;
80 handle_empty_response(resp).await
81 }
82
83 pub async fn list_assets(
85 &self,
86 owner: &str,
87 repo: &str,
88 release_id: &str,
89 opts: Option<&QueryOptions>,
90 ) -> Result<Vec<Attachment>, Error> {
91 let path = format!("/repos/{}/{}/releases/{}/assets", owner, repo, release_id);
92 let resp = self.send_get(&path, opts).await?;
93 decode_response(resp).await
94 }
95
96 pub async fn upload_asset(
98 &self,
99 owner: &str,
100 repo: &str,
101 release_id: &str,
102 _opts: Option<&QueryOptions>,
103 ) -> Result<Attachment, Error> {
104 let path = format!("/repos/{}/{}/releases/{}/assets", owner, repo, release_id);
105 let resp = self.send_post(&path, Option::<&()>::None).await?;
106 decode_response(resp).await
107 }
108
109 pub async fn delete_assets(
111 &self,
112 owner: &str,
113 repo: &str,
114 release_id: &str,
115 asset_id: &str,
116 ) -> Result<(), Error> {
117 let path = format!(
118 "/repos/{}/{}/releases/{}/assets/{}",
119 owner, repo, release_id, asset_id
120 );
121 let resp = self.send_delete(&path, Option::<&()>::None).await?;
122 handle_empty_response(resp).await
123 }
124}