#![deny(missing_docs)]
use std::sync::Arc;
use aws_credential_types::cache::CredentialsCache;
use aws_credential_types::provider::SharedCredentialsProvider;
use aws_smithy_async::rt::sleep::AsyncSleep;
use aws_smithy_client::http_connector::HttpConnector;
use aws_smithy_types::retry::RetryConfig;
use aws_smithy_types::timeout::TimeoutConfig;
use crate::app_name::AppName;
use crate::docs_for;
use crate::region::Region;
#[doc(hidden)]
pub mod unified_docs {
#[macro_export]
macro_rules! docs_for {
(use_fips) => {
"When true, send this request to the FIPS-compliant regional endpoint.
If no FIPS-compliant endpoint can be determined, dispatching the request will return an error."
};
(use_dual_stack) => {
"When true, send this request to the dual-stack endpoint.
If no dual-stack endpoint is available the request MAY return an error.
**Note**: Some services do not offer dual-stack as a configurable parameter (e.g. Code Catalyst). For
these services, this setting has no effect"
};
}
}
#[derive(Debug, Clone)]
pub struct SdkConfig {
app_name: Option<AppName>,
credentials_cache: Option<CredentialsCache>,
credentials_provider: Option<SharedCredentialsProvider>,
region: Option<Region>,
endpoint_url: Option<String>,
retry_config: Option<RetryConfig>,
sleep_impl: Option<Arc<dyn AsyncSleep>>,
timeout_config: Option<TimeoutConfig>,
http_connector: Option<HttpConnector>,
use_fips: Option<bool>,
use_dual_stack: Option<bool>,
}
#[derive(Debug, Default)]
pub struct Builder {
app_name: Option<AppName>,
credentials_cache: Option<CredentialsCache>,
credentials_provider: Option<SharedCredentialsProvider>,
region: Option<Region>,
endpoint_url: Option<String>,
retry_config: Option<RetryConfig>,
sleep_impl: Option<Arc<dyn AsyncSleep>>,
timeout_config: Option<TimeoutConfig>,
http_connector: Option<HttpConnector>,
use_fips: Option<bool>,
use_dual_stack: Option<bool>,
}
impl Builder {
pub fn region(mut self, region: impl Into<Option<Region>>) -> Self {
self.set_region(region);
self
}
pub fn set_region(&mut self, region: impl Into<Option<Region>>) -> &mut Self {
self.region = region.into();
self
}
pub fn endpoint_url(mut self, endpoint_url: impl Into<String>) -> Self {
self.set_endpoint_url(Some(endpoint_url.into()));
self
}
pub fn set_endpoint_url(&mut self, endpoint_url: Option<String>) -> &mut Self {
self.endpoint_url = endpoint_url;
self
}
pub fn retry_config(mut self, retry_config: RetryConfig) -> Self {
self.set_retry_config(Some(retry_config));
self
}
pub fn set_retry_config(&mut self, retry_config: Option<RetryConfig>) -> &mut Self {
self.retry_config = retry_config;
self
}
pub fn timeout_config(mut self, timeout_config: TimeoutConfig) -> Self {
self.set_timeout_config(Some(timeout_config));
self
}
pub fn set_timeout_config(&mut self, timeout_config: Option<TimeoutConfig>) -> &mut Self {
self.timeout_config = timeout_config;
self
}
pub fn sleep_impl(mut self, sleep_impl: Arc<dyn AsyncSleep>) -> Self {
self.set_sleep_impl(Some(sleep_impl));
self
}
pub fn set_sleep_impl(&mut self, sleep_impl: Option<Arc<dyn AsyncSleep>>) -> &mut Self {
self.sleep_impl = sleep_impl;
self
}
pub fn credentials_cache(mut self, cache: CredentialsCache) -> Self {
self.set_credentials_cache(Some(cache));
self
}
pub fn set_credentials_cache(&mut self, cache: Option<CredentialsCache>) -> &mut Self {
self.credentials_cache = cache;
self
}
pub fn credentials_provider(mut self, provider: SharedCredentialsProvider) -> Self {
self.set_credentials_provider(Some(provider));
self
}
pub fn set_credentials_provider(
&mut self,
provider: Option<SharedCredentialsProvider>,
) -> &mut Self {
self.credentials_provider = provider;
self
}
pub fn app_name(mut self, app_name: AppName) -> Self {
self.set_app_name(Some(app_name));
self
}
pub fn set_app_name(&mut self, app_name: Option<AppName>) -> &mut Self {
self.app_name = app_name;
self
}
pub fn http_connector(mut self, http_connector: impl Into<HttpConnector>) -> Self {
self.set_http_connector(Some(http_connector));
self
}
pub fn set_http_connector(
&mut self,
http_connector: Option<impl Into<HttpConnector>>,
) -> &mut Self {
self.http_connector = http_connector.map(|inner| inner.into());
self
}
#[doc = docs_for!(use_fips)]
pub fn use_fips(mut self, use_fips: bool) -> Self {
self.set_use_fips(Some(use_fips));
self
}
#[doc = docs_for!(use_fips)]
pub fn set_use_fips(&mut self, use_fips: Option<bool>) -> &mut Self {
self.use_fips = use_fips;
self
}
#[doc = docs_for!(use_dual_stack)]
pub fn use_dual_stack(mut self, use_dual_stack: bool) -> Self {
self.set_use_dual_stack(Some(use_dual_stack));
self
}
#[doc = docs_for!(use_dual_stack)]
pub fn set_use_dual_stack(&mut self, use_dual_stack: Option<bool>) -> &mut Self {
self.use_dual_stack = use_dual_stack;
self
}
pub fn build(self) -> SdkConfig {
SdkConfig {
app_name: self.app_name,
credentials_cache: self.credentials_cache,
credentials_provider: self.credentials_provider,
region: self.region,
endpoint_url: self.endpoint_url,
retry_config: self.retry_config,
sleep_impl: self.sleep_impl,
timeout_config: self.timeout_config,
http_connector: self.http_connector,
use_fips: self.use_fips,
use_dual_stack: self.use_dual_stack,
}
}
}
impl SdkConfig {
pub fn region(&self) -> Option<&Region> {
self.region.as_ref()
}
pub fn endpoint_url(&self) -> Option<&str> {
self.endpoint_url.as_deref()
}
pub fn retry_config(&self) -> Option<&RetryConfig> {
self.retry_config.as_ref()
}
pub fn timeout_config(&self) -> Option<&TimeoutConfig> {
self.timeout_config.as_ref()
}
#[doc(hidden)]
pub fn sleep_impl(&self) -> Option<Arc<dyn AsyncSleep>> {
self.sleep_impl.clone()
}
pub fn credentials_cache(&self) -> Option<&CredentialsCache> {
self.credentials_cache.as_ref()
}
pub fn credentials_provider(&self) -> Option<&SharedCredentialsProvider> {
self.credentials_provider.as_ref()
}
pub fn app_name(&self) -> Option<&AppName> {
self.app_name.as_ref()
}
pub fn http_connector(&self) -> Option<&HttpConnector> {
self.http_connector.as_ref()
}
pub fn use_fips(&self) -> Option<bool> {
self.use_fips
}
pub fn use_dual_stack(&self) -> Option<bool> {
self.use_dual_stack
}
pub fn builder() -> Builder {
Builder::default()
}
}