#![allow(dead_code, clippy::unwrap_used, clippy::expect_used)]
use std::sync::{Mutex, MutexGuard, PoisonError};
use crate::datadog::auth::{DATADOG_API_KEY, DATADOG_API_URL, DATADOG_APP_KEY, DATADOG_SITE};
static DATADOG_ENV_MUTEX: Mutex<()> = Mutex::new(());
pub(crate) struct EnvGuard {
_lock: MutexGuard<'static, ()>,
snapshot: Vec<(&'static str, Option<String>)>,
}
impl EnvGuard {
pub(crate) fn take() -> Self {
let lock = DATADOG_ENV_MUTEX
.lock()
.unwrap_or_else(PoisonError::into_inner);
let keys = [
"HOME",
DATADOG_API_KEY,
DATADOG_APP_KEY,
DATADOG_SITE,
DATADOG_API_URL,
];
let snapshot = keys
.into_iter()
.map(|k| (k, std::env::var(k).ok()))
.collect();
Self {
_lock: lock,
snapshot,
}
}
}
impl Drop for EnvGuard {
fn drop(&mut self) {
for (k, v) in &self.snapshot {
match v {
Some(val) => std::env::set_var(k, val),
None => std::env::remove_var(k),
}
}
}
}
pub(crate) fn with_empty_home(_guard: &EnvGuard) -> tempfile::TempDir {
let dir = tempfile::tempdir().expect("create tempdir");
std::env::set_var("HOME", dir.path());
std::env::remove_var(DATADOG_API_KEY);
std::env::remove_var(DATADOG_APP_KEY);
std::env::remove_var(DATADOG_SITE);
std::env::remove_var(DATADOG_API_URL);
dir
}