use crate::credentials::{Credentials, CredentialsProvider};
use crate::{Error, Result};
#[derive(Clone, Debug, Default)]
pub struct EnvironmentCredentialsProvider {
_priv: (),
}
impl EnvironmentCredentialsProvider {
pub fn new() -> Self {
Self { _priv: () }
}
fn read() -> Option<Credentials> {
if let (Ok(ak), Ok(sk)) = (
std::env::var("ALIBABA_CLOUD_ACCESS_KEY_ID"),
std::env::var("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
) && !ak.is_empty()
&& !sk.is_empty()
{
let token = std::env::var("ALIBABA_CLOUD_SECURITY_TOKEN")
.ok()
.filter(|s| !s.is_empty());
return Some(match token {
Some(t) => Credentials::with_sts(ak, sk, t, None),
None => Credentials::new(ak, sk),
});
}
if let (Ok(ak), Ok(sk)) = (std::env::var("OSS_ACCESS_KEY_ID"), std::env::var("OSS_ACCESS_KEY_SECRET"))
&& !ak.is_empty()
&& !sk.is_empty()
{
let token = std::env::var("OSS_SESSION_TOKEN").ok().filter(|s| !s.is_empty());
return Some(match token {
Some(t) => Credentials::with_sts(ak, sk, t, None),
None => Credentials::new(ak, sk),
});
}
None
}
}
impl CredentialsProvider for EnvironmentCredentialsProvider {
async fn get_credentials(&self) -> Result<Credentials> {
Self::read().ok_or(Error::InvalidCredentials)
}
}