use std::sync::Mutex;
static INITIALIZED: Mutex<bool> = Mutex::new(false);
pub(crate) fn init() {
let mut done = INITIALIZED
.lock()
.expect("keyring store init mutex poisoned");
if *done {
return;
}
match try_init() {
Ok(()) => *done = true,
Err(e) => tracing::warn!("Failed to initialize OS keyring store: {e}"),
}
}
#[cfg(target_os = "macos")]
fn try_init() -> keyring_core::Result<()> {
keyring_core::set_default_store(apple_native_keyring_store::keychain::Store::new()?);
Ok(())
}
#[cfg(target_os = "windows")]
fn try_init() -> keyring_core::Result<()> {
keyring_core::set_default_store(windows_native_keyring_store::Store::new()?);
Ok(())
}
#[cfg(target_os = "linux")]
fn try_init() -> keyring_core::Result<()> {
keyring_core::set_default_store(dbus_secret_service_keyring_store::Store::new()?);
Ok(())
}
#[cfg(not(any(target_os = "macos", target_os = "windows", target_os = "linux")))]
fn try_init() -> keyring_core::Result<()> {
Ok(())
}