aws_config/environment/
region.rs1use crate::meta::region::{future, ProvideRegion};
7use aws_types::os_shim_internal::Env;
8use aws_types::region::Region;
9
10#[derive(Debug, Default)]
15pub struct EnvironmentVariableRegionProvider {
16 env: Env,
17}
18
19impl EnvironmentVariableRegionProvider {
20 pub fn new() -> Self {
22 EnvironmentVariableRegionProvider { env: Env::real() }
23 }
24
25 pub(crate) fn new_with_env(env: Env) -> Self {
29 EnvironmentVariableRegionProvider { env }
30 }
31}
32
33impl ProvideRegion for EnvironmentVariableRegionProvider {
34 fn region(&self) -> future::ProvideRegion<'_> {
35 let region = self
36 .env
37 .get("AWS_REGION")
38 .or_else(|_| self.env.get("AWS_DEFAULT_REGION"))
39 .map(Region::new)
40 .ok();
41 future::ProvideRegion::ready(region)
42 }
43}
44#[cfg(test)]
45mod test {
46 use crate::environment::region::EnvironmentVariableRegionProvider;
47 use crate::meta::region::ProvideRegion;
48 use aws_types::os_shim_internal::Env;
49 use aws_types::region::Region;
50 use futures_util::FutureExt;
51
52 fn test_provider(vars: &[(&str, &str)]) -> EnvironmentVariableRegionProvider {
53 EnvironmentVariableRegionProvider::new_with_env(Env::from_slice(vars))
54 }
55
56 #[test]
57 fn no_region() {
58 assert_eq!(
59 test_provider(&[])
60 .region()
61 .now_or_never()
62 .expect("no polling"),
63 None
64 );
65 }
66
67 #[test]
68 fn prioritize_aws_region() {
69 let provider = test_provider(&[
70 ("AWS_REGION", "us-east-1"),
71 ("AWS_DEFAULT_REGION", "us-east-2"),
72 ]);
73 assert_eq!(
74 provider.region().now_or_never().expect("no polling"),
75 Some(Region::new("us-east-1"))
76 );
77 }
78
79 #[test]
80 fn fallback_to_default_region() {
81 assert_eq!(
82 test_provider(&[("AWS_DEFAULT_REGION", "us-east-2")])
83 .region()
84 .now_or_never()
85 .expect("no polling"),
86 Some(Region::new("us-east-2"))
87 );
88 }
89}