pub enum GetOutcome {
Value(String),
NotUnlocked,
NotFound,
}
#[cfg(unix)]
mod imp {
use super::GetOutcome;
use crate::daemon::{self, Request, Response};
use anyhow::{anyhow, Result};
use std::path::PathBuf;
fn base() -> PathBuf {
daemon::base_dir()
}
pub fn available() -> bool {
daemon::is_running(&base())
}
pub fn unlock(vault: &str, passphrase: &str) -> Option<Result<()>> {
if !available() {
return None;
}
let req = Request::Unlock {
vault: vault.to_string(),
passphrase: passphrase.to_string(),
};
Some(match daemon::send(&base(), &req) {
Ok(Response::Unlocked) => Ok(()),
Ok(Response::Error { message }) => Err(anyhow!(message)),
Ok(other) => Err(anyhow!("unexpected daemon response: {other:?}")),
Err(e) => Err(e),
})
}
pub fn lock(vault: &str) -> Option<usize> {
if !available() {
return None;
}
match daemon::send(
&base(),
&Request::Lock {
vault: vault.to_string(),
},
) {
Ok(Response::Locked { count }) => Some(count),
_ => Some(0),
}
}
pub fn lock_all() -> Option<usize> {
if !available() {
return None;
}
match daemon::send(&base(), &Request::LockAll) {
Ok(Response::Locked { count }) => Some(count),
_ => Some(0),
}
}
pub fn get(vault: &str, secret: &str) -> Option<GetOutcome> {
if !available() {
return None;
}
let req = Request::Get {
vault: vault.to_string(),
secret: secret.to_string(),
};
match daemon::send(&base(), &req) {
Ok(Response::Secret { value }) => Some(GetOutcome::Value(value)),
Ok(Response::NotUnlocked) => Some(GetOutcome::NotUnlocked),
Ok(Response::NotFound) => Some(GetOutcome::NotFound),
_ => None,
}
}
pub fn unlocked_vaults() -> Vec<String> {
if !available() {
return Vec::new();
}
match daemon::send(&base(), &Request::Status) {
Ok(Response::Status { vaults }) => vaults.into_iter().map(|v| v.name).collect(),
_ => Vec::new(),
}
}
}
#[cfg(not(unix))]
mod imp {
use super::GetOutcome;
use anyhow::Result;
pub fn unlock(_vault: &str, _passphrase: &str) -> Option<Result<()>> {
None
}
pub fn lock(_vault: &str) -> Option<usize> {
None
}
pub fn lock_all() -> Option<usize> {
None
}
pub fn get(_vault: &str, _secret: &str) -> Option<GetOutcome> {
None
}
pub fn unlocked_vaults() -> Vec<String> {
Vec::new()
}
}
pub use imp::{get, lock, lock_all, unlock, unlocked_vaults};