oauth2_gitlab/extensions/
builder.rs

1use 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//
15#[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}