#[cfg(unix)]
use std::io::Write;
use crate::cli::SecretsAction;
#[cfg(unix)]
mod doctor;
#[cfg(unix)]
mod paste;
#[cfg(unix)]
mod session;
#[cfg(unix)]
mod value;
#[cfg(unix)]
mod verbs;
#[cfg(unix)]
pub(crate) use session::Ctx;
#[cfg(unix)]
pub(crate) use value::{StdinSource, SystemClipboard, ValueSource};
#[cfg(unix)]
pub(crate) async fn run(action: SecretsAction) -> anyhow::Result<()> {
let client = trusty_secrets::server::OnDemandSecrets::new()
.map_err(|e| anyhow::anyhow!("tm secrets: {e}"))?;
let project = std::env::current_dir()?;
let clipboard = SystemClipboard::system();
let ctx = Ctx {
client: &client,
project: &project,
clipboard: &clipboard,
stdin: &StdinSource,
ci: doctor::is_ci(std::env::var("CI").ok().as_deref()),
};
dispatch(&ctx, action, &mut std::io::stdout()).await
}
#[cfg(not(unix))]
pub(crate) async fn run(_action: SecretsAction) -> anyhow::Result<()> {
anyhow::bail!("tm secrets: the secrets socket needs a Unix platform")
}
#[cfg(unix)]
pub(crate) async fn dispatch(
ctx: &Ctx<'_>,
action: SecretsAction,
out: &mut dyn Write,
) -> anyhow::Result<()> {
match action {
SecretsAction::Set {
key,
group,
value,
extra,
} => {
let args = verbs::SetArgs {
key: key.text(),
group: group.as_ref().map(|g| g.text()),
value: value.as_ref().map(|v| v.text()),
extra: !extra.is_empty(),
};
verbs::set(ctx, args, out).await
}
SecretsAction::List => verbs::list(ctx, out).await,
SecretsAction::Remove { key, group } => {
verbs::remove(ctx, key.text(), group.as_ref().map(|g| g.text()), out).await
}
SecretsAction::Import { path, group } => {
verbs::import(ctx, &path, group.as_ref().map(|g| g.text()), out).await
}
SecretsAction::Copy { from, to, keys } => {
let keys: Vec<&str> = keys.iter().map(|k| k.text()).collect();
verbs::copy(ctx, &from, &to, &keys, out).await
}
SecretsAction::Doctor => doctor::doctor(ctx, out).await,
}
}
#[cfg(all(test, unix))]
mod paste_tests;
#[cfg(all(test, unix))]
mod tests;