| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| use {crate::config::api::ReadConfig, serde_json::Value, std::collections::HashMap}; |
| |
| pub(crate) struct EnvironmentVariable<'a> { |
| environment_variables: &'a HashMap<&'static str, Vec<&'static str>>, |
| } |
| |
| impl<'a> EnvironmentVariable<'a> { |
| pub(crate) fn new(environment_variables: &'a HashMap<&'static str, Vec<&'static str>>) -> Self { |
| Self { environment_variables } |
| } |
| } |
| |
| impl ReadConfig for EnvironmentVariable<'_> { |
| fn get(&self, key: &str) -> Option<Value> { |
| match self.environment_variables.get(key) { |
| Some(vars) => vars |
| .iter() |
| .map(|var| std::env::var(var).map_or(None, |v| Some(Value::String(v)))) |
| .find(|val| val.is_some()) |
| .flatten(), |
| None => None, |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // tests |
| |
| #[cfg(test)] |
| mod test { |
| use super::*; |
| |
| #[test] |
| fn test_environment_variables() { |
| let (env_key, env_key_2) = ("test", "test_2"); |
| let (env_var_1, env_var_1_value) = ("FFX_ENV_TEST_1", "test 1"); |
| let (env_var_2, env_var_2_value) = ("FFX_ENV_TEST_2", "test 2"); |
| let (env_var_3, env_var_3_value) = ("FFX_ENV_TEST_3", "test 3"); |
| let (env_var_4, env_var_4_value) = ("FFX_ENV_TEST_4", "test 4"); |
| vec![env_var_1, env_var_2, env_var_3, env_var_4].iter().for_each(std::env::remove_var); |
| |
| let mut environment_variables = HashMap::<&str, Vec<&str>>::new(); |
| environment_variables.insert(env_key, vec![env_var_1, env_var_2, env_var_3]); |
| environment_variables.insert(env_key_2, vec![env_var_4]); |
| |
| let config = EnvironmentVariable::new(&environment_variables); |
| |
| let missing_key = "whatever"; |
| assert_eq!(None, config.get(missing_key)); |
| assert_eq!(None, config.get(env_key)); |
| assert_eq!(None, config.get(env_key_2)); |
| |
| std::env::set_var(env_var_4, env_var_4_value); |
| assert_eq!(Some(Value::String(env_var_4_value.to_string())), config.get(env_key_2)); |
| |
| std::env::set_var(env_var_3, env_var_3_value); |
| assert_eq!(Some(Value::String(env_var_3_value.to_string())), config.get(env_key)); |
| std::env::set_var(env_var_2, env_var_2_value); |
| assert_eq!(Some(Value::String(env_var_2_value.to_string())), config.get(env_key)); |
| std::env::set_var(env_var_1, env_var_1_value); |
| assert_eq!(Some(Value::String(env_var_1_value.to_string())), config.get(env_key)); |
| } |
| } |