use std::ffi::OsStr;
use crate::common::mix_all::ROCKETMQ_HOME_ENV;
pub struct EnvUtils;
impl EnvUtils {
pub fn get_property<K: AsRef<OsStr>>(key: K) -> Option<String> {
std::env::var(key).ok()
}
pub fn get_property_or_default<K: AsRef<OsStr>>(key: K, default: impl Into<String>) -> String {
std::env::var(key).unwrap_or_else(|_| default.into())
}
pub fn get_property_as_i32<K: AsRef<OsStr>>(key: K, default: i32) -> i32 {
std::env::var(key)
.ok()
.and_then(|v| v.parse::<i32>().ok())
.unwrap_or(default)
}
pub fn get_property_as_bool<K: AsRef<OsStr>>(key: K, default: bool) -> bool {
std::env::var(key)
.ok()
.and_then(|v| {
let lower = v.to_lowercase();
match lower.as_str() {
"true" | "1" => Some(true),
"false" | "0" => Some(false),
_ => None,
}
})
.unwrap_or(default)
}
pub fn put_property<K: AsRef<OsStr>, V: AsRef<OsStr>>(key: K, value: V) {
unsafe {
std::env::set_var(key, value);
}
}
pub fn get_rocketmq_home() -> String {
std::env::var(ROCKETMQ_HOME_ENV).unwrap_or_else(|_| unsafe {
let rocketmq_home_dir = std::env::current_dir()
.ok()
.and_then(|p| p.into_os_string().into_string().ok())
.unwrap_or_else(|| ".".to_string());
std::env::set_var(ROCKETMQ_HOME_ENV, &rocketmq_home_dir);
rocketmq_home_dir
})
}
}
#[cfg(test)]
mod tests {
use std::path::PathBuf;
use super::*;
#[test]
fn test_get_property_existing_variable() {
let key = "HOME";
let expected_value = "/home/user";
unsafe {
std::env::set_var(key, expected_value);
}
let result = EnvUtils::get_property(key);
assert_eq!(result, Some(expected_value.to_string()));
}
#[test]
fn test_get_property_non_existing_variable() {
let key = "NON_EXISTING_VARIABLE";
let result = EnvUtils::get_property(key);
assert_eq!(result, None);
}
#[test]
fn test_get_rocketmq_home_non_existing_variable() {
unsafe {
std::env::remove_var(ROCKETMQ_HOME_ENV);
}
let result = EnvUtils::get_rocketmq_home();
assert_eq!(result, std::env::current_dir().unwrap().to_string_lossy().to_string());
}
#[test]
fn put_property_sets_value() {
let key = "TEST_ENV_VAR";
let value = "test_value";
EnvUtils::put_property(key, value);
let result = std::env::var(key).unwrap();
assert_eq!(result, value);
}
#[test]
fn put_property_overwrites_existing_value() {
let key = "TEST_ENV_VAR1";
let initial_value = "initial_value";
let new_value = "new_value";
unsafe {
std::env::set_var(key, initial_value);
}
EnvUtils::put_property(key, new_value);
let result = std::env::var(key).unwrap();
assert_eq!(result, new_value);
}
#[test]
fn put_property_handles_empty_value() {
let key = "TEST_ENV_VAR2";
let value = "";
EnvUtils::put_property(key, value);
let result = std::env::var(key).unwrap();
assert_eq!(result, value);
}
#[test]
fn retrieves_env_variable_value() {
std::env::set_var("TEST_KEY", "test_value");
assert_eq!(
EnvUtils::get_property_or_default("TEST_KEY", "default_value"),
"test_value"
);
std::env::remove_var("TEST_KEY");
}
#[test]
fn returns_default_when_env_variable_not_set() {
assert_eq!(
EnvUtils::get_property_or_default("NON_EXISTENT_KEY", "default_value"),
"default_value"
);
}
#[test]
fn retrieves_env_variable_as_i32() {
std::env::set_var("TEST_INT_KEY", "42");
assert_eq!(EnvUtils::get_property_as_i32("TEST_INT_KEY", 0), 42);
std::env::remove_var("TEST_INT_KEY");
}
#[test]
fn returns_default_when_env_variable_as_i32_not_set() {
assert_eq!(EnvUtils::get_property_as_i32("NON_EXISTENT_INT_KEY", 10), 10);
}
#[test]
fn returns_default_when_env_variable_as_i32_invalid() {
std::env::set_var("INVALID_INT_KEY", "not_a_number");
assert_eq!(EnvUtils::get_property_as_i32("INVALID_INT_KEY", 5), 5);
std::env::remove_var("INVALID_INT_KEY");
}
#[test]
fn returns_default_when_env_variable_as_bool_not_set() {
assert!(EnvUtils::get_property_as_bool("NON_EXISTENT_BOOL_KEY", true));
assert!(!EnvUtils::get_property_as_bool("NON_EXISTENT_BOOL_KEY", false));
}
#[test]
fn returns_default_when_env_variable_as_bool_invalid() {
std::env::set_var("INVALID_BOOL_KEY", "not_a_bool");
assert!(EnvUtils::get_property_as_bool("INVALID_BOOL_KEY", true));
assert!(!EnvUtils::get_property_as_bool("INVALID_BOOL_KEY", false));
std::env::remove_var("INVALID_BOOL_KEY");
}
}