1use crate::client::{Client, decode_response, handle_empty_response};
4use crate::errors::Error;
5use crate::types::*;
6
7impl Client {
8 pub async fn get(&self, owner: &str, repo: &str) -> Result<Repository, Error> {
10 let path = format!("/repos/{}/{}", owner, repo);
11 let resp = self.send_get(&path, None).await?;
12 decode_response(resp).await
13 }
14
15 pub async fn update(
17 &self,
18 owner: &str,
19 repo: &str,
20 params: &UpdateRepositoryParams,
21 ) -> Result<Repository, Error> {
22 let path = format!("/repos/{}/{}", owner, repo);
23 let resp = self.send_patch(&path, Some(params)).await?;
24 decode_response(resp).await
25 }
26
27 pub async fn delete(&self, owner: &str, repo: &str) -> Result<(), Error> {
29 let path = format!("/repos/{}/{}", owner, repo);
30 let resp = self.send_delete(&path, Option::<&()>::None).await?;
31 handle_empty_response(resp).await
32 }
33
34 pub async fn list_repo_secrets(
36 &self,
37 owner: &str,
38 repo: &str,
39 opts: Option<&QueryOptions>,
40 ) -> Result<SecretList, Error> {
41 let path = format!("/repos/{}/{}/actions/secrets", owner, repo);
42 let resp = self.send_get(&path, opts).await?;
43 decode_response(resp).await
44 }
45
46 pub async fn get_repo_secret(
48 &self,
49 owner: &str,
50 repo: &str,
51 secretname: &str,
52 ) -> Result<Secret, Error> {
53 let path = format!("/repos/{}/{}/actions/secrets/{}", owner, repo, secretname);
54 let resp = self.send_get(&path, None).await?;
55 decode_response(resp).await
56 }
57
58 pub async fn create_or_update_repo_secret(
60 &self,
61 owner: &str,
62 repo: &str,
63 secretname: &str,
64 _opts: Option<&QueryOptions>,
65 ) -> Result<Secret, Error> {
66 let path = format!("/repos/{}/{}/actions/secrets/{}", owner, repo, secretname);
67 let resp = self.send_put(&path, Option::<&()>::None).await?;
68 decode_response(resp).await
69 }
70
71 pub async fn delete_repo_secret(
73 &self,
74 owner: &str,
75 repo: &str,
76 secretname: &str,
77 ) -> Result<(), Error> {
78 let path = format!("/repos/{}/{}/actions/secrets/{}", owner, repo, secretname);
79 let resp = self.send_delete(&path, Option::<&()>::None).await?;
80 handle_empty_response(resp).await
81 }
82
83 pub async fn list_branches(
85 &self,
86 owner: &str,
87 repo: &str,
88 opts: Option<&QueryOptions>,
89 ) -> Result<Vec<Branch>, Error> {
90 let path = format!("/repos/{}/{}/branches", owner, repo);
91 let resp = self.send_get(&path, opts).await?;
92 decode_response(resp).await
93 }
94
95 pub async fn list_collaborators(
97 &self,
98 owner: &str,
99 repo: &str,
100 opts: Option<&QueryOptions>,
101 ) -> Result<Vec<Collaborator>, Error> {
102 let path = format!("/repos/{}/{}/collaborators", owner, repo);
103 let resp = self.send_get(&path, opts).await?;
104 decode_response(resp).await
105 }
106
107 pub async fn add_collaborator(
109 &self,
110 owner: &str,
111 repo: &str,
112 collaborator: &str,
113 params: &AddCollaboratorParams,
114 ) -> Result<CollaboratorInvitation, Error> {
115 let path = format!("/repos/{}/{}/collaborators/{}", owner, repo, collaborator);
116 let resp = self.send_put(&path, Some(params)).await?;
117 decode_response(resp).await
118 }
119
120 pub async fn list_commits(
122 &self,
123 owner: &str,
124 repo: &str,
125 opts: Option<&QueryOptions>,
126 ) -> Result<Vec<Commit>, Error> {
127 let path = format!("/repos/{}/{}/commits", owner, repo);
128 let resp = self.send_get(&path, opts).await?;
129 decode_response(resp).await
130 }
131
132 pub async fn get_commit(&self, owner: &str, repo: &str, sha: &str) -> Result<Commit, Error> {
134 let path = format!("/repos/{}/{}/commits/{}", owner, repo, sha);
135 let resp = self.send_get(&path, None).await?;
136 decode_response(resp).await
137 }
138
139 pub async fn compare_commits(
141 &self,
142 owner: &str,
143 repo: &str,
144 basehead: &str,
145 opts: Option<&QueryOptions>,
146 ) -> Result<CompareResponse, Error> {
147 let path = format!("/repos/{}/{}/compare/{}", owner, repo, basehead);
148 let resp = self.send_get(&path, opts).await?;
149 decode_response(resp).await
150 }
151
152 pub async fn get_content(
154 &self,
155 owner: &str,
156 repo: &str,
157 filepath: &str,
158 opts: Option<&QueryOptions>,
159 ) -> Result<ContentsResponse, Error> {
160 let path = format!("/repos/{}/{}/contents/{}", owner, repo, filepath);
161 let resp = self.send_get(&path, opts).await?;
162 decode_response(resp).await
163 }
164
165 pub async fn create_or_update_file(
167 &self,
168 owner: &str,
169 repo: &str,
170 filepath: &str,
171 params: &CreateFileParams,
172 ) -> Result<FileCreationResponse, Error> {
173 let path = format!("/repos/{}/{}/contents/{}", owner, repo, filepath);
174 let resp = self.send_put(&path, Some(params)).await?;
175 decode_response(resp).await
176 }
177
178 pub async fn delete_file(
180 &self,
181 owner: &str,
182 repo: &str,
183 filepath: &str,
184 params: &DeleteFileParams,
185 ) -> Result<FileDeleteResponse, Error> {
186 let path = format!("/repos/{}/{}/contents/{}", owner, repo, filepath);
187 let resp = self.send_delete(&path, Some(params)).await?;
188 decode_response(resp).await
189 }
190
191 pub async fn create_fork(
193 &self,
194 owner: &str,
195 repo: &str,
196 params: &CreateForkParams,
197 ) -> Result<Repository, Error> {
198 let path = format!("/repos/{}/{}/forks", owner, repo);
199 let resp = self.send_post(&path, Some(params)).await?;
200 decode_response(resp).await
201 }
202
203 pub async fn create_commit(
205 &self,
206 owner: &str,
207 repo: &str,
208 params: &CreateCommitParams,
209 ) -> Result<Commit, Error> {
210 let path = format!("/repos/{}/{}/git/commits", owner, repo);
211 let resp = self.send_post(&path, Some(params)).await?;
212 decode_response(resp).await
213 }
214
215 pub async fn list_matching_refs(
217 &self,
218 owner: &str,
219 repo: &str,
220 r#ref: &str,
221 ) -> Result<Vec<Reference>, Error> {
222 let path = format!("/repos/{}/{}/git/matching-refs/{}", owner, repo, r#ref);
223 let resp = self.send_get(&path, None).await?;
224 decode_response(resp).await
225 }
226
227 pub async fn get_ref(&self, owner: &str, repo: &str, r#ref: &str) -> Result<Reference, Error> {
229 let path = format!("/repos/{}/{}/git/ref/{}", owner, repo, r#ref);
230 let resp = self.send_get(&path, None).await?;
231 decode_response(resp).await
232 }
233
234 pub async fn create_ref(
236 &self,
237 owner: &str,
238 repo: &str,
239 params: &CreateReferenceParams,
240 ) -> Result<Reference, Error> {
241 let path = format!("/repos/{}/{}/git/refs", owner, repo);
242 let resp = self.send_post(&path, Some(params)).await?;
243 decode_response(resp).await
244 }
245
246 pub async fn delete_ref(&self, owner: &str, repo: &str, r#ref: &str) -> Result<(), Error> {
248 let path = format!("/repos/{}/{}/git/refs/{}", owner, repo, r#ref);
249 let resp = self.send_delete(&path, Option::<&()>::None).await?;
250 handle_empty_response(resp).await
251 }
252
253 pub async fn create_tree(
255 &self,
256 owner: &str,
257 repo: &str,
258 params: &CreateTreeParams,
259 ) -> Result<RepoTree, Error> {
260 let path = format!("/repos/{}/{}/git/trees", owner, repo);
261 let resp = self.send_post(&path, Some(params)).await?;
262 decode_response(resp).await
263 }
264
265 pub async fn get_tree(
267 &self,
268 owner: &str,
269 repo: &str,
270 sha: &str,
271 opts: Option<&QueryOptions>,
272 ) -> Result<GitTreeResponse, Error> {
273 let path = format!("/repos/{}/{}/git/trees/{}", owner, repo, sha);
274 let resp = self.send_get(&path, opts).await?;
275 decode_response(resp).await
276 }
277
278 pub async fn list_languages(
280 &self,
281 owner: &str,
282 repo: &str,
283 ) -> Result<serde_json::Value, Error> {
284 let path = format!("/repos/{}/{}/languages", owner, repo);
285 let resp = self.send_get(&path, None).await?;
286 decode_response(resp).await
287 }
288
289 pub async fn list_pulls(
291 &self,
292 owner: &str,
293 repo: &str,
294 opts: Option<&QueryOptions>,
295 ) -> Result<Vec<PullRequest>, Error> {
296 let path = format!("/repos/{}/{}/pulls", owner, repo);
297 let resp = self.send_get(&path, opts).await?;
298 decode_response(resp).await
299 }
300
301 pub async fn get_pull(
303 &self,
304 owner: &str,
305 repo: &str,
306 pull_number: f64,
307 ) -> Result<PullRequest, Error> {
308 let path = format!("/repos/{}/{}/pulls/{}", owner, repo, pull_number);
309 let resp = self.send_get(&path, None).await?;
310 decode_response(resp).await
311 }
312
313 pub async fn update_pull(
315 &self,
316 owner: &str,
317 repo: &str,
318 pull_number: f64,
319 params: &UpdatePullRequestParams,
320 ) -> Result<PullRequest, Error> {
321 let path = format!("/repos/{}/{}/pulls/{}", owner, repo, pull_number);
322 let resp = self.send_patch(&path, Some(params)).await?;
323 decode_response(resp).await
324 }
325
326 pub async fn list_for_authenticated_user(
328 &self,
329 opts: Option<&QueryOptions>,
330 ) -> Result<Vec<Repository>, Error> {
331 let path = "/user/repos";
332 let resp = self.send_get(&path, opts).await?;
333 decode_response(resp).await
334 }
335
336 pub async fn create_for_authenticated_user(
338 &self,
339 params: &CreateRepositoryParams,
340 ) -> Result<Repository, Error> {
341 let path = "/user/repos";
342 let resp = self.send_post(&path, Some(params)).await?;
343 decode_response(resp).await
344 }
345}