#![allow(dead_code, clippy::unwrap_used, clippy::expect_used)]
use std::sync::{Mutex, MutexGuard, PoisonError};
use crate::gmail::account::GMAIL_ACCOUNT_ENV;
use crate::gmail::auth::{GMAIL_CLIENT_ID, GMAIL_CLIENT_SECRET, GMAIL_REFRESH_TOKEN, GMAIL_SCOPE};
static GMAIL_ENV_MUTEX: &Mutex<()> = &crate::test_support::HOME_ENV_MUTEX;
pub(crate) struct EnvGuard {
_lock: MutexGuard<'static, ()>,
snapshot: Vec<(&'static str, Option<String>)>,
}
impl EnvGuard {
pub(crate) fn take() -> Self {
let lock = GMAIL_ENV_MUTEX
.lock()
.unwrap_or_else(PoisonError::into_inner);
let keys = [
"HOME",
GMAIL_CLIENT_ID,
GMAIL_CLIENT_SECRET,
GMAIL_REFRESH_TOKEN,
GMAIL_SCOPE,
GMAIL_ACCOUNT_ENV,
];
let snapshot = keys
.into_iter()
.map(|k| (k, std::env::var(k).ok()))
.collect();
Self {
_lock: lock,
snapshot,
}
}
pub(crate) fn clear_credentials(&self) -> tempfile::TempDir {
let dir = {
std::fs::create_dir_all("tmp").ok();
tempfile::TempDir::new_in("tmp").unwrap()
};
std::env::set_var("HOME", dir.path());
std::env::remove_var(crate::utils::settings::PROFILE_ENV_VAR);
std::env::remove_var(GMAIL_CLIENT_ID);
std::env::remove_var(GMAIL_CLIENT_SECRET);
std::env::remove_var(GMAIL_REFRESH_TOKEN);
std::env::remove_var(GMAIL_SCOPE);
std::env::remove_var(GMAIL_ACCOUNT_ENV);
dir
}
}
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),
}
}
}
}