use crate::credential::{CommonCredentialsProvider, Credentials, EnvCredentialsProvider, StaticCredentialsProvider};
use async_trait::async_trait;
use serde::de::StdError;
use std::sync::Arc;
#[async_trait]
pub trait CredentialsProvider<C>: Sized
where
C: Credentials,
{
async fn credentials(&self, expires: i64) -> Result<Arc<C>, Box<dyn StdError + Send + Sync>>;
fn new(c: C) -> Result<Self, Box<dyn StdError + Send + Sync>>;
}
#[async_trait]
impl<C> CredentialsProvider<C> for CommonCredentialsProvider<C>
where
C: Credentials + Send + Sync,
{
async fn credentials(&self, _: i64) -> Result<Arc<C>, Box<dyn StdError + Send + Sync>> {
Ok(self.credentials.clone())
}
fn new(c: C) -> Result<Self, Box<dyn StdError + Send + Sync>> {
Ok(CommonCredentialsProvider {
credentials: Arc::new(c),
})
}
}
#[async_trait]
impl<C> CredentialsProvider<C> for StaticCredentialsProvider<C>
where
C: Credentials + Send + Sync,
{
async fn credentials(&self, _: i64) -> Result<Arc<C>, Box<dyn StdError + Send + Sync>> {
Ok(self.cred.clone())
}
fn new(cred: C) -> Result<Self, Box<dyn StdError + Send + Sync>> {
Ok(Self {
cred: Arc::new(cred),
})
}
}
#[async_trait]
impl<C> CredentialsProvider<C> for EnvCredentialsProvider<C>
where
C: Credentials + Send + Sync,
{
async fn credentials(&self, _: i64) -> Result<Arc<C>, Box<dyn StdError + Send + Sync>> {
Ok(self.cred.clone())
}
fn new(cred: C) -> Result<Self, Box<dyn StdError + Send + Sync>> {
Ok(Self {
cred: Arc::new(cred),
})
}
}