oauth2_twitter/extensions/
builder.rs

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