Skip to content

Commit 3521827

Browse files
committed
github: Adjust team_membership() to return Result<Option<_>, _>
We can handle the `NotFound` case inside the lib, to make it easier for users of the fn.
1 parent 44a7016 commit 3521827

File tree

5 files changed

+18
-18
lines changed

5 files changed

+18
-18
lines changed

crates/crates_io_github/src/lib.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ pub trait GitHubClient: Send + Sync {
3333
team_id: i32,
3434
username: &str,
3535
auth: &AccessToken,
36-
) -> Result<GitHubTeamMembership>;
36+
) -> Result<Option<GitHubTeamMembership>>;
3737
async fn org_membership(
3838
&self,
3939
org_id: i32,
@@ -120,9 +120,14 @@ impl GitHubClient for RealGitHubClient {
120120
team_id: i32,
121121
username: &str,
122122
auth: &AccessToken,
123-
) -> Result<GitHubTeamMembership> {
123+
) -> Result<Option<GitHubTeamMembership>> {
124124
let url = format!("/organizations/{org_id}/team/{team_id}/memberships/{username}");
125-
self.request(&url, auth).await
125+
match self.request(&url, auth).await {
126+
Ok(membership) => Ok(Some(membership)),
127+
// Officially how `false` is returned
128+
Err(GitHubError::NotFound(_)) => Ok(None),
129+
Err(err) => Err(err),
130+
}
126131
}
127132

128133
async fn org_membership(

src/models/team.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -233,16 +233,11 @@ async fn team_with_gh_id_contains_user(
233233
// check that "state": "active"
234234

235235
let token = AccessToken::new(user.gh_access_token.expose_secret().to_string());
236-
let membership = match gh_client
236+
let membership = gh_client
237237
.team_membership(github_org_id, github_team_id, &user.gh_login, &token)
238-
.await
239-
{
240-
// Officially how `false` is returned
241-
Err(GitHubError::NotFound(_)) => return Ok(false),
242-
x => x?,
243-
};
238+
.await?;
244239

245240
// There is also `state: pending` for which we could possibly give
246241
// some feedback, but it's not obvious how that should work.
247-
Ok(membership.state == "active")
242+
Ok(membership.is_some_and(|m| m.state == "active"))
248243
}

src/tests/issues/issue1205.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ fn github_mock() -> MockGitHubClient {
7474
github_mock
7575
.expect_team_membership()
7676
.with(eq(1), eq(2), eq("foo"), always())
77-
.returning(|_, _, _, _| Ok(active_membership()));
77+
.returning(|_, _, _, _| Ok(Some(active_membership())));
7878

7979
github_mock
8080
}

src/tests/routes/crates/owners/remove.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,9 @@ async fn test_remove_uppercase_team() {
138138
.expect_team_membership()
139139
.with(eq(1), eq(2), eq("foo"), always())
140140
.returning(|_, _, _, _| {
141-
Ok(GitHubTeamMembership {
141+
Ok(Some(GitHubTeamMembership {
142142
state: "active".to_string(),
143-
})
143+
}))
144144
});
145145

146146
let (app, _, cookie) = TestApp::full().with_github(github_mock).with_user().await;

src/tests/util/github.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ impl MockData {
120120
org_id: i32,
121121
team_id: i32,
122122
username: &str,
123-
) -> Result<GitHubTeamMembership, GitHubError> {
123+
) -> Result<Option<GitHubTeamMembership>, GitHubError> {
124124
let team = self
125125
.orgs
126126
.iter()
@@ -131,11 +131,11 @@ impl MockData {
131131
.find(|team| team.id == team_id)
132132
.ok_or_else(not_found)?;
133133
if team.members.contains(&username) {
134-
Ok(GitHubTeamMembership {
134+
Ok(Some(GitHubTeamMembership {
135135
state: "active".into(),
136-
})
136+
}))
137137
} else {
138-
Err(not_found())
138+
Ok(None)
139139
}
140140
}
141141

0 commit comments

Comments
 (0)