oauth2_zoho/extensions/
builder.rs1use 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#[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 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}