oauth2_gitlab/extensions/
builder.rs1use oauth2_client::{
2 extensions::{
3 AccessTokenResponseSuccessfulBody, Builder, BuilderObtainUserInfoError,
4 BuilderObtainUserInfoOutput, GrantInfo,
5 },
6 oauth2_core::types::ScopeParameter,
7 re_exports::Scope,
8};
9
10use crate::GitlabScope;
11
12use super::GitlabUserInfoEndpoint;
13
14#[derive(Debug, Clone)]
16pub struct GitlabExtensionsBuilder;
17
18impl<SCOPE> Builder<SCOPE> for GitlabExtensionsBuilder
19where
20 SCOPE: Scope,
21{
22 fn obtain_user_info(
23 &self,
24 _grant_info: GrantInfo<SCOPE>,
25 access_token: &AccessTokenResponseSuccessfulBody<SCOPE>,
26 ) -> Result<BuilderObtainUserInfoOutput, BuilderObtainUserInfoError> {
27 let scopes = access_token
28 .scope
29 .to_owned()
30 .map(|x| ScopeParameter::<String>::from(&x).0)
31 .unwrap_or_default();
32
33 if scopes.contains(&GitlabScope::ReadUser.to_string()) {
34 return Ok(BuilderObtainUserInfoOutput::Respond(Box::new(
35 GitlabUserInfoEndpoint::new(&access_token.access_token),
36 )));
37 }
38
39 Ok(BuilderObtainUserInfoOutput::None)
40 }
41}