oauth2_client/extensions/
builder.rs

1use dyn_clone::{clone_trait_object, DynClone};
2
3use crate::re_exports::Scope;
4
5use super::{AccessTokenResponseSuccessfulBody, GrantInfo, UserInfo, UserInfoEndpointBox};
6
7//
8//
9//
10pub trait Builder<SCOPE>: DynClone
11where
12    SCOPE: Scope,
13{
14    fn obtain_user_info(
15        &self,
16        _grant_info: GrantInfo<SCOPE>,
17        _access_token: &AccessTokenResponseSuccessfulBody<SCOPE>,
18    ) -> Result<BuilderObtainUserInfoOutput, BuilderObtainUserInfoError>;
19}
20
21#[derive(Debug)]
22pub enum BuilderObtainUserInfoOutput {
23    None,
24    Static(UserInfo),
25    Respond(UserInfoEndpointBox),
26}
27
28#[derive(thiserror::Error, Debug)]
29pub enum BuilderObtainUserInfoError {
30    //
31    #[error("Unreachable {0}")]
32    Unreachable(&'static str),
33    //
34    #[error("Other {0}")]
35    Other(Box<dyn std::error::Error + Send + Sync>),
36}
37
38//
39clone_trait_object!(<SCOPE> Builder<SCOPE> where SCOPE: Scope + Clone);
40
41impl<SCOPE> core::fmt::Debug for dyn Builder<SCOPE> + Send + Sync
42where
43    SCOPE: Scope,
44{
45    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
46        f.debug_struct("Builder").finish()
47    }
48}
49
50//
51//
52//
53#[derive(Debug, Clone)]
54pub struct DefaultBuilder;
55impl<SCOPE> Builder<SCOPE> for DefaultBuilder
56where
57    SCOPE: Scope,
58{
59    fn obtain_user_info(
60        &self,
61        _grant_info: GrantInfo<SCOPE>,
62        _access_token: &AccessTokenResponseSuccessfulBody<SCOPE>,
63    ) -> Result<BuilderObtainUserInfoOutput, BuilderObtainUserInfoError> {
64        Ok(BuilderObtainUserInfoOutput::None)
65    }
66}