1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use futures::future::FutureResult;
use futures::{Future, Poll};
use rusoto_credential::{AwsCredentials, CredentialsError, ProvideAwsCredentials, StaticProvider};
use rusoto_credential::{DefaultCredentialsProvider, DefaultCredentialsProviderFuture};

pub enum CombinedProvider {
    Static(StaticProvider),
    Simple(Box<DefaultCredentialsProvider>),
}

impl CombinedProvider {
    pub fn new(access_key: Option<String>, secret_key: Option<String>) -> CombinedProvider {
        match (access_key, secret_key) {
            (Some(aws_access_key), Some(aws_secret_key)) => {
                CombinedProvider::with_credentials(aws_access_key, aws_secret_key)
            }
            _ => CombinedProvider::with_default(),
        }
    }

    pub fn with_credentials(aws_access_key: String, aws_secret_key: String) -> CombinedProvider {
        CombinedProvider::Static(StaticProvider::new(
            aws_access_key,
            aws_secret_key,
            None,
            None,
        ))
    }

    pub fn with_default() -> CombinedProvider {
        CombinedProvider::Simple(Box::new(DefaultCredentialsProvider::new().unwrap()))
    }
}

pub enum CombinedProviderFuture {
    Static(FutureResult<AwsCredentials, CredentialsError>),
    Simple(DefaultCredentialsProviderFuture),
}

impl Future for CombinedProviderFuture {
    type Item = AwsCredentials;
    type Error = CredentialsError;

    fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
        match *self {
            CombinedProviderFuture::Static(ref mut f) => f.poll(),
            CombinedProviderFuture::Simple(ref mut f) => f.poll(),
        }
    }
}

impl ProvideAwsCredentials for CombinedProvider {
    type Future = CombinedProviderFuture;

    fn credentials(&self) -> Self::Future {
        match *self {
            CombinedProvider::Static(ref p) => p.credentials().into(),
            CombinedProvider::Simple(ref p) => p.credentials().into(),
        }
    }
}

impl From<DefaultCredentialsProviderFuture> for CombinedProviderFuture {
    fn from(future: DefaultCredentialsProviderFuture) -> CombinedProviderFuture {
        CombinedProviderFuture::Simple(future)
    }
}

impl From<FutureResult<AwsCredentials, CredentialsError>> for CombinedProviderFuture {
    fn from(future: FutureResult<AwsCredentials, CredentialsError>) -> CombinedProviderFuture {
        CombinedProviderFuture::Static(future)
    }
}