use futures::Future;
use std::{env, pin::Pin};
use crate::Credentials;
pub type CredenticalFuture = Pin<Box<dyn Future<Output = Credentials> + Send>>;
pub trait Provider: Send {
fn fetct(&mut self) -> CredenticalFuture;
}
#[derive(Clone)]
pub struct StaticProvider(Credentials);
impl StaticProvider {
pub fn new<T: Into<String>>(ak: T, sk: T, st: Option<String>) -> Self {
Self(Credentials::new(ak, sk, st, None))
}
pub fn from_env() -> Option<Self> {
if let (Ok(ak), Ok(sk), st) = (
env::var("MINIO_ACCESS_KEY"),
env::var("MINIO_SECRET_KEY"),
env::var("MINIO_SESSION_TOKEN"),
) {
Some(Self::new(ak, sk, st.ok()))
} else {
None
}
}
pub fn from_env_aws() -> Option<Self> {
let ak = env::var("AWS_ACCESS_KEY_ID");
let ak = if !ak.is_ok() {
env::var("AWS_ACCESS_KEY")
} else {
ak
};
let sk = env::var("AWS_ACCESS_KEY_ID");
let sk = if !sk.is_ok() {
env::var("AWS_ACCESS_KEY")
} else {
sk
};
if let (Ok(ak), Ok(sk), st) = (ak, sk, env::var("MINIO_SESSION_TOKEN")) {
Some(Self::new(ak, sk, st.ok()))
} else {
None
}
}
}
impl Provider for StaticProvider {
fn fetct(&mut self) -> CredenticalFuture {
let cred = self.0.clone();
Box::pin(async move { cred })
}
}