#![warn(missing_docs)]
#[allow(dead_code)]
const PKG_VERSION: &str = env!("CARGO_PKG_VERSION");
#[cfg(feature = "default-provider")]
pub mod default_provider;
#[cfg(feature = "environment")]
pub mod environment;
#[cfg(feature = "meta")]
pub mod meta;
#[cfg(feature = "profile")]
pub mod profile;
#[cfg(feature = "sts")]
pub mod sts;
#[cfg(test)]
mod test_case;
#[cfg(feature = "web-identity-token")]
pub mod web_identity_token;
#[cfg(feature = "http-provider")]
pub mod ecs;
pub mod provider_config;
mod cache;
#[cfg(feature = "imds")]
pub mod imds;
mod json_credentials;
mod http_provider;
#[cfg(feature = "default-provider")]
pub fn from_env() -> ConfigLoader {
ConfigLoader::default()
}
#[cfg(feature = "default-provider")]
pub async fn load_from_env() -> aws_types::config::Config {
from_env().load().await
}
#[cfg(feature = "default-provider")]
pub use loader::ConfigLoader;
#[cfg(feature = "default-provider")]
mod loader {
use crate::default_provider::{credentials, region, retry_config};
use crate::meta::region::ProvideRegion;
use aws_smithy_types::retry::RetryConfig;
use aws_types::config::Config;
use aws_types::credentials::{ProvideCredentials, SharedCredentialsProvider};
#[derive(Default, Debug)]
pub struct ConfigLoader {
region: Option<Box<dyn ProvideRegion>>,
retry_config: Option<RetryConfig>,
credentials_provider: Option<SharedCredentialsProvider>,
}
impl ConfigLoader {
pub fn region(mut self, region: impl ProvideRegion + 'static) -> Self {
self.region = Some(Box::new(region));
self
}
pub fn retry_config(mut self, retry_config: RetryConfig) -> Self {
self.retry_config = Some(retry_config);
self
}
pub fn credentials_provider(
mut self,
credentials_provider: impl ProvideCredentials + 'static,
) -> Self {
self.credentials_provider = Some(SharedCredentialsProvider::new(credentials_provider));
self
}
pub async fn load(self) -> aws_types::config::Config {
let region = if let Some(provider) = self.region {
provider.region().await
} else {
region::default_provider().region().await
};
let retry_config = if let Some(retry_config) = self.retry_config {
retry_config
} else {
retry_config::default_provider().retry_config().await
};
let credentials_provider = if let Some(provider) = self.credentials_provider {
provider
} else {
let mut builder = credentials::DefaultCredentialsChain::builder();
builder.set_region(region.clone());
SharedCredentialsProvider::new(builder.build().await)
};
Config::builder()
.region(region)
.retry_config(retry_config)
.credentials_provider(credentials_provider)
.build()
}
}
}
mod connector {
use crate::provider_config::HttpSettings;
use aws_smithy_async::rt::sleep::AsyncSleep;
use aws_smithy_client::erase::DynConnector;
use std::sync::Arc;
#[allow(dead_code)]
pub(crate) fn expect_connector(connector: Option<DynConnector>) -> DynConnector {
connector.expect("A connector was not available. Either set a custom connector or enable the `rustls` and `native-tls` crate features.")
}
#[cfg(feature = "rustls")]
pub(crate) fn default_connector(
settings: &HttpSettings,
sleep: Option<Arc<dyn AsyncSleep>>,
) -> Option<DynConnector> {
let hyper = base(settings, sleep).build(aws_smithy_client::conns::https());
Some(DynConnector::new(hyper))
}
fn base(
settings: &HttpSettings,
sleep: Option<Arc<dyn AsyncSleep>>,
) -> aws_smithy_client::hyper_ext::Builder {
let mut hyper =
aws_smithy_client::hyper_ext::Adapter::builder().timeout(&settings.timeout_settings);
if let Some(sleep) = sleep {
hyper = hyper.sleep_impl(sleep);
}
hyper
}
#[cfg(all(not(feature = "rustls"), feature = "native-tls"))]
pub fn default_connector() -> Option<DynConnector> {
base(settings, sleep).build(aws_smithy_client::conns::native_tls());
Some(DynConnector::new(hyper))
}
#[cfg(not(any(feature = "rustls", feature = "native-tls")))]
pub fn default_connector() -> Option<DynConnector> {
None
}
}