#[derive(Debug, thiserror::Error)]
pub enum SecretError {
#[error("keychain: {0}")]
Keychain(String),
}
const SERVICE: &str = "hyprcorrect";
pub fn get(name: &str) -> Result<Option<String>, SecretError> {
let entry = entry(name)?;
match entry.get_password() {
Ok(value) => Ok(Some(value)),
Err(keyring::Error::NoEntry) => Ok(None),
Err(e) => Err(SecretError::Keychain(e.to_string())),
}
}
pub fn set(name: &str, value: &str) -> Result<(), SecretError> {
let entry = entry(name)?;
entry
.set_password(value)
.map_err(|e| SecretError::Keychain(e.to_string()))
}
pub fn delete(name: &str) -> Result<(), SecretError> {
let entry = entry(name)?;
match entry.delete_credential() {
Ok(()) | Err(keyring::Error::NoEntry) => Ok(()),
Err(e) => Err(SecretError::Keychain(e.to_string())),
}
}
fn entry(name: &str) -> Result<keyring::Entry, SecretError> {
keyring::Entry::new(SERVICE, name).map_err(|e| SecretError::Keychain(e.to_string()))
}