aws_config/default_provider/
region.rs1use 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
13pub fn default_provider() -> impl ProvideRegion {
20 Builder::default().build()
21}
22
23#[derive(Debug)]
25pub struct DefaultRegionChain(RegionProviderChain);
26
27impl DefaultRegionChain {
28 pub async fn region(&self) -> Option<Region> {
30 self.0.region().await
31 }
32
33 pub fn builder() -> Builder {
35 Builder::default()
36 }
37}
38
39#[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 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 pub fn profile_name(mut self, name: &str) -> Self {
60 self.profile_file = self.profile_file.profile_name(name);
61 self
62 }
63
64 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}