use std::sync::Arc;
use crate::{
core::{
Error,
dpop::{NoDPoP, ResourceServerDPoP},
platform::{MaybeSendBoxFuture, MaybeSendSync},
},
grant::core::TokenResponse,
};
pub trait TokenSource: MaybeSendSync {
fn token(&self) -> MaybeSendBoxFuture<'_, Result<Arc<TokenResponse>, Error>>;
fn resource_server_dpop(&self) -> &dyn ResourceServerDPoP {
&NoDPoP
}
fn invalidate(&self) {}
fn has_pending_token(&self) -> bool {
false
}
fn clear(&self) -> MaybeSendBoxFuture<'_, Result<(), Error>> {
Box::pin(async { Ok(()) })
}
}
macro_rules! forward_token_source {
($wrapper:ty) => {
impl<T: TokenSource + ?Sized> TokenSource for $wrapper {
fn token(&self) -> MaybeSendBoxFuture<'_, Result<Arc<TokenResponse>, Error>> {
(**self).token()
}
fn resource_server_dpop(&self) -> &dyn ResourceServerDPoP {
(**self).resource_server_dpop()
}
fn invalidate(&self) {
(**self).invalidate();
}
fn has_pending_token(&self) -> bool {
(**self).has_pending_token()
}
fn clear(&self) -> MaybeSendBoxFuture<'_, Result<(), Error>> {
(**self).clear()
}
}
};
}
forward_token_source!(&T);
forward_token_source!(Box<T>);
forward_token_source!(Arc<T>);