aws_credential_types/
credential_fn.rs
1use std::fmt::{self, Debug, Formatter};
9use std::future::Future;
10use std::marker::PhantomData;
11
12use crate::provider::{future, ProvideCredentials};
13
14#[derive(Copy, Clone)]
18pub struct ProvideCredentialsFn<'c, T> {
19 f: T,
20 phantom: PhantomData<&'c T>,
21}
22
23impl<T> Debug for ProvideCredentialsFn<'_, T> {
24 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
25 write!(f, "ProvideCredentialsFn")
26 }
27}
28
29impl<'c, T, F> ProvideCredentials for ProvideCredentialsFn<'c, T>
30where
31 T: Fn() -> F + Send + Sync + 'c,
32 F: Future<Output = crate::provider::Result> + Send + 'static,
33{
34 fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>
35 where
36 Self: 'a,
37 {
38 future::ProvideCredentials::new((self.f)())
39 }
40}
41
42pub fn provide_credentials_fn<'c, T, F>(f: T) -> ProvideCredentialsFn<'c, T>
63where
64 T: Fn() -> F + Send + Sync + 'c,
65 F: Future<Output = crate::provider::Result> + Send + 'static,
66{
67 ProvideCredentialsFn {
68 f,
69 phantom: Default::default(),
70 }
71}
72
73#[cfg(test)]
74mod test {
75 use crate::credential_fn::provide_credentials_fn;
76 use crate::{provider::ProvideCredentials, Credentials};
77
78 fn assert_send_sync<T: Send + Sync>() {}
79
80 #[test]
81 fn creds_are_send_sync() {
82 assert_send_sync::<Credentials>()
83 }
84
85 #[tokio::test]
87 async fn provide_credentials_fn_closure_can_borrow() {
88 fn check_is_str_ref(_input: &str) {}
89 async fn test_async_provider(input: String) -> crate::provider::Result {
90 Ok(Credentials::new(&input, &input, None, None, "test"))
91 }
92
93 let things_to_borrow = vec!["one".to_string(), "two".to_string()];
94
95 let mut providers = Vec::new();
96 for thing in &things_to_borrow {
97 let provider = provide_credentials_fn(move || {
98 check_is_str_ref(thing);
99 test_async_provider(thing.into())
100 });
101 providers.push(provider);
102 }
103
104 let (two, one) = (providers.pop().unwrap(), providers.pop().unwrap());
105 assert_eq!(
106 "one",
107 one.provide_credentials().await.unwrap().access_key_id()
108 );
109 assert_eq!(
110 "two",
111 two.provide_credentials().await.unwrap().access_key_id()
112 );
113 }
114}