aws_config/default_provider/
region.rs

1/*
2 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
6use aws_types::region::Region;
7
8use crate::environment::region::EnvironmentVariableRegionProvider;
9use crate::meta::region::{ProvideRegion, RegionProviderChain};
10use crate::provider_config::ProviderConfig;
11use crate::{imds, profile};
12
13/// Default Region Provider chain
14///
15/// This provider will check the following sources in order:
16/// 1. [Environment variables](EnvironmentVariableRegionProvider)
17/// 2. [Profile file](crate::profile::region::ProfileFileRegionProvider)
18/// 3. [EC2 IMDSv2](crate::imds::region)
19pub fn default_provider() -> impl ProvideRegion {
20    Builder::default().build()
21}
22
23/// Default region provider chain
24#[derive(Debug)]
25pub struct DefaultRegionChain(RegionProviderChain);
26
27impl DefaultRegionChain {
28    /// Load a region from this chain
29    pub async fn region(&self) -> Option<Region> {
30        self.0.region().await
31    }
32
33    /// Builder for [`DefaultRegionChain`]
34    pub fn builder() -> Builder {
35        Builder::default()
36    }
37}
38
39/// Builder for [DefaultRegionChain]
40#[derive(Debug, Default)]
41pub struct Builder {
42    env_provider: EnvironmentVariableRegionProvider,
43    profile_file: profile::region::Builder,
44    imds: imds::region::Builder,
45}
46
47impl Builder {
48    /// Configure the default chain
49    ///
50    /// Exposed for overriding the environment when unit-testing providers
51    pub(crate) fn configure(mut self, configuration: &ProviderConfig) -> Self {
52        self.env_provider = EnvironmentVariableRegionProvider::new_with_env(configuration.env());
53        self.profile_file = self.profile_file.configure(configuration);
54        self.imds = self.imds.configure(configuration);
55        self
56    }
57
58    /// Override the profile name used by this provider
59    pub fn profile_name(mut self, name: &str) -> Self {
60        self.profile_file = self.profile_file.profile_name(name);
61        self
62    }
63
64    /// Build a [DefaultRegionChain]
65    pub fn build(self) -> DefaultRegionChain {
66        DefaultRegionChain(
67            RegionProviderChain::first_try(self.env_provider)
68                .or_else(self.profile_file.build())
69                .or_else(self.imds.build()),
70        )
71    }
72}
73
74impl ProvideRegion for DefaultRegionChain {
75    fn region(&self) -> crate::meta::region::future::ProvideRegion<'_> {
76        ProvideRegion::region(&self.0)
77    }
78}