pub fn expand_env_var(raw: &str) -> String {
if raw.starts_with("${") && raw.ends_with('}') && raw.len() > 3 {
let var = &raw[2..raw.len() - 1];
if !var.is_empty() {
return std::env::var(var).unwrap_or_default();
}
}
raw.to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn expand_env_var_passthrough() {
assert_eq!(expand_env_var("ghp_actualtoken"), "ghp_actualtoken");
assert_eq!(expand_env_var(""), "");
assert_eq!(expand_env_var("no-special-chars"), "no-special-chars");
}
#[test]
fn expand_env_var_placeholder() {
std::env::set_var("TGA_TEST_TOKEN_741", "resolved-value");
assert_eq!(expand_env_var("${TGA_TEST_TOKEN_741}"), "resolved-value");
std::env::remove_var("TGA_TEST_TOKEN_741");
}
#[test]
fn expand_env_var_unset_var() {
std::env::remove_var("TGA_TEST_DEFINITELY_UNSET_741");
assert_eq!(
expand_env_var("${TGA_TEST_DEFINITELY_UNSET_741}"),
"",
"unset var should expand to empty string, not the literal placeholder"
);
}
#[test]
fn expand_env_var_partial_placeholder() {
assert_eq!(expand_env_var("${NOCLOSE"), "${NOCLOSE");
assert_eq!(expand_env_var("VAR}"), "VAR}");
assert_eq!(expand_env_var("$VAR"), "$VAR");
assert_eq!(expand_env_var("${}"), "${}");
}
}