oauth2_client/extensions/
builder.rs1use dyn_clone::{clone_trait_object, DynClone};
2
3use crate::re_exports::Scope;
4
5use super::{AccessTokenResponseSuccessfulBody, GrantInfo, UserInfo, UserInfoEndpointBox};
6
7pub 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 #[error("Unreachable {0}")]
32 Unreachable(&'static str),
33 #[error("Other {0}")]
35 Other(Box<dyn std::error::Error + Send + Sync>),
36}
37
38clone_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#[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}