use std::env;
#[allow(dead_code)]
pub fn dual_prefix_env(canonical_name: &str) -> Option<String> {
debug_assert!(
canonical_name.starts_with("CODELENS_"),
"dual_prefix_env expects a CODELENS_* canonical name, got `{}`",
canonical_name
);
let symbiote_name = canonical_name.replacen("CODELENS_", "SYMBIOTE_", 1);
if let Ok(value) = env::var(&symbiote_name)
&& !value.is_empty()
{
return Some(value);
}
match env::var(canonical_name) {
Ok(value) if !value.is_empty() => Some(value),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
static ENV_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());
fn with_env<F: FnOnce()>(symbiote: Option<&str>, codelens: Option<&str>, f: F) {
let _guard = ENV_LOCK.lock().unwrap_or_else(|p| p.into_inner());
let prev_symbiote = env::var("SYMBIOTE_ENV_COMPAT_TEST").ok();
let prev_codelens = env::var("CODELENS_ENV_COMPAT_TEST").ok();
unsafe {
match symbiote {
Some(v) => env::set_var("SYMBIOTE_ENV_COMPAT_TEST", v),
None => env::remove_var("SYMBIOTE_ENV_COMPAT_TEST"),
}
match codelens {
Some(v) => env::set_var("CODELENS_ENV_COMPAT_TEST", v),
None => env::remove_var("CODELENS_ENV_COMPAT_TEST"),
}
}
f();
unsafe {
match prev_symbiote {
Some(v) => env::set_var("SYMBIOTE_ENV_COMPAT_TEST", v),
None => env::remove_var("SYMBIOTE_ENV_COMPAT_TEST"),
}
match prev_codelens {
Some(v) => env::set_var("CODELENS_ENV_COMPAT_TEST", v),
None => env::remove_var("CODELENS_ENV_COMPAT_TEST"),
}
}
}
#[test]
fn symbiote_wins_when_both_set() {
with_env(Some("sym"), Some("code"), || {
assert_eq!(
dual_prefix_env("CODELENS_ENV_COMPAT_TEST").as_deref(),
Some("sym")
);
});
}
#[test]
fn codelens_used_when_only_it_is_set() {
with_env(None, Some("code"), || {
assert_eq!(
dual_prefix_env("CODELENS_ENV_COMPAT_TEST").as_deref(),
Some("code")
);
});
}
#[test]
fn symbiote_used_when_only_it_is_set() {
with_env(Some("sym"), None, || {
assert_eq!(
dual_prefix_env("CODELENS_ENV_COMPAT_TEST").as_deref(),
Some("sym")
);
});
}
#[test]
fn empty_symbiote_falls_back_to_codelens() {
with_env(Some(""), Some("code"), || {
assert_eq!(
dual_prefix_env("CODELENS_ENV_COMPAT_TEST").as_deref(),
Some("code")
);
});
}
#[test]
fn none_when_both_unset() {
with_env(None, None, || {
assert_eq!(dual_prefix_env("CODELENS_ENV_COMPAT_TEST"), None);
});
}
}