diff options
Diffstat (limited to 'src/api/repos.rs')
-rw-r--r-- | src/api/repos.rs | 109 |
1 files changed, 39 insertions, 70 deletions
diff --git a/src/api/repos.rs b/src/api/repos.rs index 3b91423..80c1f41 100644 --- a/src/api/repos.rs +++ b/src/api/repos.rs @@ -27,7 +27,7 @@ mod teams; use crate::error::HttpSnafu; use crate::models::commits::GitCommitObject; -use crate::models::repos; +use crate::models::{repos, RepositoryId}; use crate::repos::file::GetReadmeBuilder; use crate::{models, params, Octocrab, Result}; pub use branches::ListBranchesBuilder; @@ -46,18 +46,32 @@ pub use status::{CreateStatusBuilder, ListStatusesBuilder}; pub use tags::ListTagsBuilder; pub use teams::ListTeamsBuilder; +#[derive(Clone)] +pub(crate) enum RepoRef { + ByOwnerAndName(String, String), + ById(RepositoryId), +} + +impl std::fmt::Display for RepoRef { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + RepoRef::ByOwnerAndName(owner, name) => write!(f, "repos/{}/{}", owner, name), + RepoRef::ById(id) => write!(f, "repositories/{}", id), + } + } +} + /// Handler for GitHub's repository API. /// /// Created with [`Octocrab::repos`]. pub struct RepoHandler<'octo> { crab: &'octo Octocrab, - owner: String, - repo: String, + repo: RepoRef, } impl<'octo> RepoHandler<'octo> { - pub(crate) fn new(crab: &'octo Octocrab, owner: String, repo: String) -> Self { - Self { crab, owner, repo } + pub(crate) fn new(crab: &'octo Octocrab, repo: RepoRef) -> Self { + Self { crab, repo } } /// Get's a repository's license. @@ -68,11 +82,7 @@ impl<'octo> RepoHandler<'octo> { /// # } /// ``` pub async fn license(&self) -> Result<models::repos::Content> { - let route = format!( - "/repos/{owner}/{repo}/license", - owner = self.owner, - repo = self.repo, - ); + let route = format!("/{}/license", self.repo); self.crab.get(route, None::<&()>).await } @@ -85,11 +95,7 @@ impl<'octo> RepoHandler<'octo> { /// # } /// ``` pub async fn public_key(&self) -> Result<models::PublicKey> { - let route = format!( - "/repos/{owner}/{repo}/actions/secrets/public-key", - owner = self.owner, - repo = self.repo, - ); + let route = format!("/{}/actions/secrets/public-key", self.repo); self.crab.get(route, None::<&()>).await } @@ -105,11 +111,7 @@ impl<'octo> RepoHandler<'octo> { /// # } /// ``` pub async fn get(&self) -> Result<models::Repository> { - let route = format!( - "/repos/{owner}/{repo}", - owner = self.owner, - repo = self.repo, - ); + let route = format!("/{}", self.repo); self.crab.get(route, None::<&()>).await } @@ -124,11 +126,7 @@ impl<'octo> RepoHandler<'octo> { /// # } /// ``` pub async fn get_community_profile_metrics(&self) -> Result<models::RepositoryMetrics> { - let route = format!( - "/repos/{owner}/{repo}/community/profile", - owner = self.owner, - repo = self.repo, - ); + let route = format!("/{}/community/profile", self.repo); self.crab.get(route, None::<&()>).await } @@ -149,8 +147,7 @@ impl<'octo> RepoHandler<'octo> { reference: ¶ms::repos::Reference, ) -> Result<models::repos::Ref> { let route = format!( - "/repos/{owner}/{repo}/git/ref/{reference}", - owner = self.owner, + "/{repo}/git/ref/{reference}", repo = self.repo, reference = reference.ref_url(), ); @@ -171,8 +168,7 @@ impl<'octo> RepoHandler<'octo> { /// ``` pub async fn get_tag(&self, tag_sha: impl Into<String>) -> Result<models::repos::GitTag> { let route = format!( - "/repos/{owner}/{repo}/git/tags/{tag_sha}", - owner = self.owner, + "/{repo}/git/tags/{tag_sha}", repo = self.repo, tag_sha = tag_sha.into(), ); @@ -198,11 +194,7 @@ impl<'octo> RepoHandler<'octo> { reference: ¶ms::repos::Reference, sha: impl Into<String>, ) -> Result<models::repos::Ref> { - let route = format!( - "/repos/{owner}/{repo}/git/refs", - owner = self.owner, - repo = self.repo, - ); + let route = format!("/{}/git/refs", self.repo); self.crab .post( route, @@ -230,8 +222,7 @@ impl<'octo> RepoHandler<'octo> { /// ``` pub async fn delete_ref(&self, reference: ¶ms::repos::Reference) -> Result<()> { let route = format!( - "/repos/{owner}/{repo}/git/refs/{ref}", - owner = self.owner, + "/{repo}/git/refs/{ref}", repo = self.repo, ref = reference.ref_url() ); @@ -514,11 +505,7 @@ impl<'octo> RepoHandler<'octo> { /// # } /// ``` pub async fn list_languages(&self) -> Result<models::repos::Languages> { - let route = format!( - "/repos/{owner}/{repo}/languages", - owner = self.owner, - repo = self.repo, - ); + let route = format!("/{}/languages", self.repo); self.crab.get(route, None::<&()>).await } @@ -610,11 +597,7 @@ impl<'octo> RepoHandler<'octo> { &self, hook: crate::models::hooks::Hook, ) -> crate::Result<crate::models::hooks::Hook> { - let route = format!( - "/repos/{org}/{repo}/hooks", - org = self.owner, - repo = self.repo - ); + let route = format!("/{}/hooks", self.repo); let res = self.crab.post(route, Some(&hook)).await?; Ok(res) @@ -637,8 +620,7 @@ impl<'octo> RepoHandler<'octo> { reference: ¶ms::repos::Reference, ) -> Result<models::CombinedStatus> { let route = format!( - "/repos/{owner}/{repo}/commits/{reference}/status", - owner = self.owner, + "/{repo}/commits/{reference}/status", repo = self.repo, reference = reference.ref_url(), ); @@ -671,8 +653,7 @@ impl<'octo> RepoHandler<'octo> { path: impl AsRef<str>, ) -> Result<http::Response<BoxBody<Bytes, crate::Error>>> { let route = format!( - "/repos/{owner}/{repo}/contents/{path}", - owner = self.owner, + "/{repo}/contents/{path}", repo = self.repo, path = path.as_ref(), ); @@ -696,11 +677,7 @@ impl<'octo> RepoHandler<'octo> { /// # } /// ``` pub async fn delete(self) -> Result<()> { - let route = format!( - "/repos/{owner}/{repo}", - owner = self.owner, - repo = self.repo - ); + let route = format!("/{}", self.repo); let uri = Uri::builder() .path_and_query(route) .build() @@ -716,8 +693,7 @@ impl<'octo> RepoHandler<'octo> { reference: impl Into<params::repos::Commitish>, ) -> Result<http::Response<BoxBody<Bytes, crate::Error>>> { let route = format!( - "/repos/{owner}/{repo}/tarball/{reference}", - owner = self.owner, + "/{repo}/tarball/{reference}", repo = self.repo, reference = reference.into(), ); @@ -733,8 +709,7 @@ impl<'octo> RepoHandler<'octo> { /// Check if a user is a repository collaborator pub async fn is_collaborator(&self, username: impl AsRef<str>) -> Result<bool> { let route = format!( - "/repos/{owner}/{repo}/collaborators/{username}", - owner = self.owner, + "/{repo}/collaborators/{username}", repo = self.repo, username = username.as_ref(), ); @@ -801,7 +776,6 @@ impl<'octo> RepoHandler<'octo> { ) -> CreateGitCommitObjectBuilder<'_, '_> { CreateGitCommitObjectBuilder::new( self, - self.owner.clone(), self.repo.clone(), message.into().to_owned(), tree.into().to_owned(), @@ -813,8 +787,9 @@ impl<'octo> RepoHandler<'octo> { pub struct CreateGitCommitObjectBuilder<'octo, 'req> { #[serde(skip)] handler: &'octo RepoHandler<'req>, - owner: String, - repo: String, + // According to [API reference](https://docs.github.com/en/rest/git/commits?apiVersion=2022-11-28#create-a-commit), repo in body is not required. + #[serde(skip)] + repo: RepoRef, message: String, tree: String, parents: Vec<String>, @@ -829,14 +804,12 @@ pub struct CreateGitCommitObjectBuilder<'octo, 'req> { impl<'octo, 'req> CreateGitCommitObjectBuilder<'octo, 'req> { pub(crate) fn new( handler: &'octo RepoHandler<'req>, - owner: String, - repo: String, + repo: RepoRef, message: String, tree: String, ) -> Self { Self { handler, - owner, repo, message, tree, @@ -873,11 +846,7 @@ impl<'octo, 'req> CreateGitCommitObjectBuilder<'octo, 'req> { /// Sends the request pub async fn send(&self) -> Result<GitCommitObject> { - let route = format!( - "/repos/{owner}/{repo}/git/commits", - owner = self.owner, - repo = self.repo, - ); + let route = format!("/{}/git/commits", self.repo); self.handler.crab.post(route, Some(&self)).await } } |