aws_config/environment/
region.rs

1/*
2 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
6use crate::meta::region::{future, ProvideRegion};
7use aws_types::os_shim_internal::Env;
8use aws_types::region::Region;
9
10/// Load a region from environment variables
11///
12/// This provider will first check the value of `AWS_REGION`, falling back to `AWS_DEFAULT_REGION`
13/// when `AWS_REGION` is unset.
14#[derive(Debug, Default)]
15pub struct EnvironmentVariableRegionProvider {
16    env: Env,
17}
18
19impl EnvironmentVariableRegionProvider {
20    /// Create a new `EnvironmentVariableRegionProvider`
21    pub fn new() -> Self {
22        EnvironmentVariableRegionProvider { env: Env::real() }
23    }
24
25    /// Create an region provider from a given `Env`
26    ///
27    /// This method is used for tests that need to override environment variables.
28    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}