use std::future::Future;
use async_trait::async_trait;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ProviderTokenArgs {
pub provider_name: String,
pub session_id: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BearerTokenError {
message: String,
}
impl BearerTokenError {
pub fn message(message: impl Into<String>) -> Self {
Self {
message: message.into(),
}
}
pub fn as_str(&self) -> &str {
&self.message
}
}
impl std::fmt::Display for BearerTokenError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.message)
}
}
impl std::error::Error for BearerTokenError {}
impl From<String> for BearerTokenError {
fn from(message: String) -> Self {
Self::message(message)
}
}
impl From<&str> for BearerTokenError {
fn from(message: &str) -> Self {
Self::message(message)
}
}
#[async_trait]
pub trait BearerTokenProvider: Send + Sync {
async fn get_token(&self, args: ProviderTokenArgs) -> Result<String, BearerTokenError>;
}
#[async_trait]
impl<F, Fut> BearerTokenProvider for F
where
F: Fn(ProviderTokenArgs) -> Fut + Send + Sync,
Fut: Future<Output = Result<String, BearerTokenError>> + Send,
{
async fn get_token(&self, args: ProviderTokenArgs) -> Result<String, BearerTokenError> {
(self)(args).await
}
}