summaryrefslogtreecommitdiff
path: root/src/api/repos.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/repos.rs')
-rw-r--r--src/api/repos.rs109
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: &params::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: &params::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: &params::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: &params::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
}
}