use crate::errors::{EnvVaultError, Result};
const SERVICE_NAME: &str = "envvault";
fn entry_key(vault_path: &str) -> String {
format!("vault:{vault_path}")
}
pub fn store_password(vault_path: &str, password: &str) -> Result<()> {
let entry = keyring::Entry::new(SERVICE_NAME, &entry_key(vault_path))
.map_err(|e| EnvVaultError::KeyringError(format!("failed to create keyring entry: {e}")))?;
entry.set_password(password).map_err(|e| {
EnvVaultError::KeyringError(format!("failed to store password in keyring: {e}"))
})?;
Ok(())
}
pub fn get_password(vault_path: &str) -> Result<Option<String>> {
let entry = keyring::Entry::new(SERVICE_NAME, &entry_key(vault_path))
.map_err(|e| EnvVaultError::KeyringError(format!("failed to create keyring entry: {e}")))?;
match entry.get_password() {
Ok(password) => Ok(Some(password)),
Err(keyring::Error::NoEntry) => Ok(None),
Err(e) => Err(EnvVaultError::KeyringError(format!(
"failed to read from keyring: {e}"
))),
}
}
pub fn delete_password(vault_path: &str) -> Result<()> {
let entry = keyring::Entry::new(SERVICE_NAME, &entry_key(vault_path))
.map_err(|e| EnvVaultError::KeyringError(format!("failed to create keyring entry: {e}")))?;
match entry.delete_credential() {
Ok(()) => Ok(()),
Err(keyring::Error::NoEntry) => Ok(()), Err(e) => Err(EnvVaultError::KeyringError(format!(
"failed to delete from keyring: {e}"
))),
}
}