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}