oauth2_zoho/extensions/
builder.rs

1use oauth2_client::{
2    extensions::{
3        AccessTokenResponseSuccessfulBody, Builder, BuilderObtainUserInfoError,
4        BuilderObtainUserInfoOutput, GrantInfo,
5    },
6    oauth2_core::types::ScopeParameter,
7    re_exports::{serde_json, Scope},
8};
9
10use super::ZohoUserInfoEndpoint;
11use crate::ZohoScope;
12
13//
14#[derive(Debug, Clone)]
15pub struct ZohoExtensionsBuilder;
16
17impl<SCOPE> Builder<SCOPE> for ZohoExtensionsBuilder
18where
19    SCOPE: Scope,
20{
21    fn obtain_user_info(
22        &self,
23        _grant_info: GrantInfo<SCOPE>,
24        access_token: &AccessTokenResponseSuccessfulBody<SCOPE>,
25    ) -> Result<BuilderObtainUserInfoOutput, BuilderObtainUserInfoError> {
26        if let Some(scope) = &access_token.scope {
27            let scope = serde_json::from_str::<ScopeParameter<ZohoScope>>(
28                serde_json::to_string(&scope).unwrap_or_default().as_str(),
29            )
30            .unwrap_or(ScopeParameter::<ZohoScope>(vec![]));
31
32            // AaaServer.profile.READ && !profile
33            if scope.0.contains(&ZohoScope::AaaServerProfileRead)
34                && !scope.0.contains(&ZohoScope::Profile)
35            {
36                return Ok(BuilderObtainUserInfoOutput::Respond(Box::new(
37                    ZohoUserInfoEndpoint::new(&access_token.access_token),
38                )));
39            }
40        }
41
42        Ok(BuilderObtainUserInfoOutput::None)
43    }
44}