use once_cell::sync::Lazy;
use regex::Regex;
use std::collections::HashMap;
static ENV_VAR_REGEX: Lazy<Regex> =
Lazy::new(|| Regex::new(r"\$\{([A-Za-z_][A-Za-z0-9_]*)\}").unwrap());
pub fn substitute_env(input: &str) -> String {
ENV_VAR_REGEX
.replace_all(input, |caps: ®ex::Captures| {
let var_name = &caps[1];
std::env::var(var_name).unwrap_or_else(|_| caps[0].to_string())
})
.to_string()
}
pub fn substitute_env_recursive(value: &serde_json::Value) -> serde_json::Value {
match value {
serde_json::Value::String(s) => serde_json::Value::String(substitute_env(s)),
serde_json::Value::Array(arr) => arr.iter().map(substitute_env_recursive).collect(),
serde_json::Value::Object(obj) => obj
.iter()
.map(|(k, v)| (k.clone(), substitute_env_recursive(v)))
.collect(),
_ => value.clone(),
}
}
pub fn substitute_with(input: &str, vars: &HashMap<String, String>) -> String {
ENV_VAR_REGEX
.replace_all(input, |caps: ®ex::Captures| {
let var_name = &caps[1];
vars.get(var_name).map(|v| v.as_str()).unwrap_or_else(|| {
std::env::var(var_name)
.unwrap_or_else(|_| caps[0].to_string())
.leak()
})
})
.to_string()
}