Skip to content

Commit 940d231

Browse files
committed
github: Adjust org_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 3521827 commit 940d231

File tree

3 files changed

+18
-20
lines changed

3 files changed

+18
-20
lines changed

crates/crates_io_github/src/lib.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub trait GitHubClient: Send + Sync {
3939
org_id: i32,
4040
username: &str,
4141
auth: &AccessToken,
42-
) -> Result<GitHubOrgMembership>;
42+
) -> Result<Option<GitHubOrgMembership>>;
4343
async fn public_keys(&self, username: &str, password: &str) -> Result<Vec<GitHubPublicKey>>;
4444
}
4545

@@ -135,12 +135,13 @@ impl GitHubClient for RealGitHubClient {
135135
org_id: i32,
136136
username: &str,
137137
auth: &AccessToken,
138-
) -> Result<GitHubOrgMembership> {
139-
self.request(
140-
&format!("/organizations/{org_id}/memberships/{username}"),
141-
auth,
142-
)
143-
.await
138+
) -> Result<Option<GitHubOrgMembership>> {
139+
let url = format!("/organizations/{org_id}/memberships/{username}");
140+
match self.request(&url, auth).await {
141+
Ok(membership) => Ok(Some(membership)),
142+
Err(GitHubError::NotFound(_)) => Ok(None),
143+
Err(err) => Err(err),
144+
}
144145
}
145146

146147
/// Returns the list of public keys that can be used to verify GitHub secret alert signatures

src/models/team.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -213,14 +213,11 @@ async fn is_gh_org_owner(
213213
user: &User,
214214
) -> Result<bool, GitHubError> {
215215
let token = AccessToken::new(user.gh_access_token.expose_secret().to_string());
216-
match gh_client
216+
let membership = gh_client
217217
.org_membership(org_id, &user.gh_login, &token)
218-
.await
219-
{
220-
Ok(membership) => Ok(membership.state == "active" && membership.role == "admin"),
221-
Err(GitHubError::NotFound(_)) => Ok(false),
222-
Err(e) => Err(e),
223-
}
218+
.await?;
219+
220+
Ok(membership.is_some_and(|m| m.state == "active" && m.role == "admin"))
224221
}
225222

226223
async fn team_with_gh_id_contains_user(

src/tests/util/github.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,28 +143,28 @@ impl MockData {
143143
&self,
144144
org_id: i32,
145145
username: &str,
146-
) -> Result<GitHubOrgMembership, GitHubError> {
146+
) -> Result<Option<GitHubOrgMembership>, GitHubError> {
147147
let org = self
148148
.orgs
149149
.iter()
150150
.find(|org| org.id == org_id)
151151
.ok_or_else(not_found)?;
152152
if org.owners.contains(&username) {
153-
Ok(GitHubOrgMembership {
153+
Ok(Some(GitHubOrgMembership {
154154
state: "active".into(),
155155
role: "admin".into(),
156-
})
156+
}))
157157
} else if org
158158
.teams
159159
.iter()
160160
.any(|team| team.members.contains(&username))
161161
{
162-
Ok(GitHubOrgMembership {
162+
Ok(Some(GitHubOrgMembership {
163163
state: "active".into(),
164164
role: "member".into(),
165-
})
165+
}))
166166
} else {
167-
Err(not_found())
167+
Ok(None)
168168
}
169169
}
170170
}

0 commit comments

Comments
 (0)