use std::{fmt::Debug, sync::Arc};
use crate::types::{OAuthCredentials, TokenAuthMethod, UserInfo};
pub trait SimpleOAuthProvider: Debug + Send + Sync {
fn authorize_url(&self) -> &str;
fn token_url(&self) -> &str;
fn default_scopes(&self) -> &'static [&'static str] {
&[]
}
fn token_auth_method(&self) -> TokenAuthMethod {
TokenAuthMethod::BasicAuth
}
}
pub trait UserInfoProvider: SimpleOAuthProvider {
fn user_info_url(&self) -> &str;
fn extract_user_info(&self, val: serde_json::Value) -> Result<UserInfo, serde_json::Error>;
fn user_info_headers(&self, _credentials: &OAuthCredentials) -> Vec<(String, String)> {
vec![]
}
}
impl<T> SimpleOAuthProvider for Box<T>
where
T: SimpleOAuthProvider + ?Sized,
{
fn authorize_url(&self) -> &str {
(**self).authorize_url()
}
fn token_url(&self) -> &str {
(**self).token_url()
}
fn default_scopes(&self) -> &'static [&'static str] {
(**self).default_scopes()
}
fn token_auth_method(&self) -> TokenAuthMethod {
(**self).token_auth_method()
}
}
impl<T> UserInfoProvider for Box<T>
where
T: UserInfoProvider + ?Sized,
{
fn user_info_url(&self) -> &str {
(**self).user_info_url()
}
fn extract_user_info(&self, val: serde_json::Value) -> Result<UserInfo, serde_json::Error> {
(**self).extract_user_info(val)
}
fn user_info_headers(&self, credentials: &OAuthCredentials) -> Vec<(String, String)> {
(**self).user_info_headers(credentials)
}
}
impl<T> SimpleOAuthProvider for Arc<T>
where
T: SimpleOAuthProvider + ?Sized,
{
fn authorize_url(&self) -> &str {
(**self).authorize_url()
}
fn token_url(&self) -> &str {
(**self).token_url()
}
fn default_scopes(&self) -> &'static [&'static str] {
(**self).default_scopes()
}
fn token_auth_method(&self) -> TokenAuthMethod {
(**self).token_auth_method()
}
}
impl<T> UserInfoProvider for Arc<T>
where
T: UserInfoProvider + ?Sized,
{
fn user_info_url(&self) -> &str {
(**self).user_info_url()
}
fn extract_user_info(&self, val: serde_json::Value) -> Result<UserInfo, serde_json::Error> {
(**self).extract_user_info(val)
}
fn user_info_headers(&self, credentials: &OAuthCredentials) -> Vec<(String, String)> {
(**self).user_info_headers(credentials)
}
}