diff --git a/crates/crates_io_github/examples/test_github_client.rs b/crates/crates_io_github/examples/test_github_client.rs index a00f1d1689b..8e7ae082a55 100644 --- a/crates/crates_io_github/examples/test_github_client.rs +++ b/crates/crates_io_github/examples/test_github_client.rs @@ -12,6 +12,12 @@ enum Request { #[clap(long, env = "GITHUB_ACCESS_TOKEN", hide_env_values = true)] access_token: SecretString, }, + GetRepository { + owner: String, + repo: String, + #[clap(long, env = "GITHUB_ACCESS_TOKEN", hide_env_values = true)] + access_token: SecretString, + }, OrgByName { org_name: String, #[clap(long, env = "GITHUB_ACCESS_TOKEN", hide_env_values = true)] @@ -58,6 +64,17 @@ async fn main() -> Result<()> { let response = github_client.current_user(&access_token).await?; println!("{response:#?}"); } + Request::GetRepository { + owner, + repo, + access_token, + } => { + let access_token = AccessToken::new(access_token.expose_secret().into()); + let response = github_client + .get_repository(&owner, &repo, &access_token) + .await?; + println!("{response:#?}"); + } Request::OrgByName { org_name, access_token, diff --git a/crates/crates_io_github/src/lib.rs b/crates/crates_io_github/src/lib.rs index 246da5c13b0..ebcdd9bdf7c 100644 --- a/crates/crates_io_github/src/lib.rs +++ b/crates/crates_io_github/src/lib.rs @@ -20,6 +20,12 @@ type Result = std::result::Result; #[async_trait] pub trait GitHubClient: Send + Sync { async fn current_user(&self, auth: &AccessToken) -> Result; + async fn get_repository( + &self, + owner: &str, + repo: &str, + auth: &AccessToken, + ) -> Result; async fn org_by_name(&self, org_name: &str, auth: &AccessToken) -> Result; async fn team_by_name( &self, @@ -102,6 +108,16 @@ impl GitHubClient for RealGitHubClient { self.request("/user", auth).await } + async fn get_repository( + &self, + owner: &str, + repo: &str, + auth: &AccessToken, + ) -> Result { + let url = format!("/repos/{owner}/{repo}"); + self.request(&url, auth).await + } + async fn org_by_name(&self, org_name: &str, auth: &AccessToken) -> Result { let url = format!("/orgs/{org_name}"); self.request(&url, auth).await @@ -191,6 +207,19 @@ pub struct GithubUser { pub name: Option, } +#[derive(Debug, Deserialize)] +pub struct GitHubRepository { + pub id: i64, + pub name: String, + pub owner: GitHubRepositoryOwner, +} + +#[derive(Debug, Deserialize)] +pub struct GitHubRepositoryOwner { + pub login: String, + pub id: i32, +} + #[derive(Debug, Deserialize)] pub struct GitHubOrganization { pub id: i32, // unique GH id (needed for membership queries)