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