1use futures::Future;
3use std::{env, pin::Pin};
4
5use crate::Credentials;
6
7pub type CredentialFuture = Pin<Box<dyn Future<Output = Credentials> + Send>>;
8
9pub trait Provider: Send + Sync {
11 fn fetch(&self) -> CredentialFuture;
12}
13
14#[derive(Debug, Clone)]
15pub struct StaticProvider(Credentials);
16
17impl StaticProvider {
18 pub fn new<T: Into<String>>(ak: T, sk: T, st: Option<String>) -> Self {
19 Self(Credentials::new(ak, sk, st, None))
20 }
21
22 pub fn from_env() -> Option<Self> {
27 if let (Ok(ak), Ok(sk), st) = (
28 env::var("MINIO_ACCESS_KEY"),
29 env::var("MINIO_SECRET_KEY"),
30 env::var("MINIO_SESSION_TOKEN"),
31 ) {
32 Some(Self::new(ak, sk, st.ok()))
33 } else {
34 None
35 }
36 }
37
38 pub fn from_env_aws() -> Option<Self> {
43 let ak = env::var("AWS_ACCESS_KEY_ID");
44 let ak = if !ak.is_ok() {
45 env::var("AWS_ACCESS_KEY")
46 } else {
47 ak
48 };
49 let sk = env::var("AWS_ACCESS_KEY_ID");
50 let sk = if !sk.is_ok() {
51 env::var("AWS_ACCESS_KEY")
52 } else {
53 sk
54 };
55 if let (Ok(ak), Ok(sk), st) = (ak, sk, env::var("MINIO_SESSION_TOKEN")) {
56 Some(Self::new(ak, sk, st.ok()))
57 } else {
58 None
59 }
60 }
61}
62
63impl Provider for StaticProvider {
64 fn fetch(&self) -> CredentialFuture {
65 let cred = self.0.clone();
66 Box::pin(async move { cred })
67 }
68}