tandem-runtime 0.6.5

Runtime utilities for Tandem
use std::ffi::OsString;
use std::path::PathBuf;

static PROVIDER_AUTH_TEST_LOCK: tokio::sync::Mutex<()> = tokio::sync::Mutex::const_new(());

struct ProviderAuthTestGuard {
    _guard: tokio::sync::MutexGuard<'static, ()>,
    previous_disable_keyring: Option<OsString>,
    previous_tandem_home: Option<OsString>,
    tandem_home: PathBuf,
}

impl Drop for ProviderAuthTestGuard {
    fn drop(&mut self) {
        restore_env_var(
            "TANDEM_PROVIDER_AUTH_DISABLE_KEYRING",
            self.previous_disable_keyring.take(),
        );
        restore_env_var("TANDEM_HOME", self.previous_tandem_home.take());
        let _ = std::fs::remove_dir_all(&self.tandem_home);
    }
}

fn restore_env_var(name: &str, previous: Option<OsString>) {
    if let Some(value) = previous {
        std::env::set_var(name, value);
    } else {
        std::env::remove_var(name);
    }
}

async fn provider_auth_test_guard() -> ProviderAuthTestGuard {
    let guard = PROVIDER_AUTH_TEST_LOCK.lock().await;
    let tandem_home = std::env::temp_dir().join(format!(
        "tandem-runtime-provider-auth-{}",
        Uuid::new_v4()
    ));
    std::fs::create_dir_all(&tandem_home).expect("provider auth test home");
    let previous_disable_keyring = std::env::var_os("TANDEM_PROVIDER_AUTH_DISABLE_KEYRING");
    let previous_tandem_home = std::env::var_os("TANDEM_HOME");
    std::env::set_var("TANDEM_PROVIDER_AUTH_DISABLE_KEYRING", "1");
    std::env::set_var("TANDEM_HOME", &tandem_home);
    ProviderAuthTestGuard {
        _guard: guard,
        previous_disable_keyring,
        previous_tandem_home,
        tandem_home,
    }
}