tsafe-cli 1.1.0

Local-first secrets runtime for developers — inject credentials via exec, never shell history or .env files
Documentation
//! `tsafe tooling ...` command handlers.

use anyhow::Result;
use tsafe_core::tooling_inventory::{
    check_inventory, init_tooling, suggest_keys, SuggestKey, SuggestKeysRequest,
};

use crate::cli::ToolingAction;

pub fn cmd_tooling(action: ToolingAction) -> Result<()> {
    match action {
        ToolingAction::Init {
            root,
            namespace,
            force,
        } => {
            let report = init_tooling(&root, namespace.as_deref(), force)?;
            println!("created: {}", report.created);
            println!("keys: {}", report.keys_path.display());
            println!("policy: {}", report.policy_path.display());
            println!("readme: {}", report.readme_path.display());
            println!("namespace: {}", report.namespace);
        }
        ToolingAction::Check { root, json } => {
            let report = check_inventory(&root)?;
            if json {
                println!("{}", serde_json::to_string_pretty(&report)?);
            } else {
                println!("ok: {}", report.ok);
                println!("keys: {}", report.keys_path.display());
                if let Some(namespace) = &report.namespace {
                    println!("namespace: {namespace}");
                }
                println!("entries: {}", report.entries.len());
                for warning in &report.warnings {
                    println!("warn: {warning}");
                }
                for error in &report.errors {
                    println!("error: {error}");
                }
            }
            if !report.ok {
                anyhow::bail!("tooling inventory check failed");
            }
        }
        ToolingAction::Suggest {
            root,
            namespace,
            section,
            key,
            purpose,
            consumer,
            rotation,
            apply,
            reason,
        } => {
            let report = suggest_keys(
                &root,
                SuggestKeysRequest {
                    namespace,
                    source: "cli".to_string(),
                    reason,
                    apply,
                    keys: vec![SuggestKey {
                        key,
                        purpose,
                        consumer,
                        rotation,
                        section,
                    }],
                },
            )?;
            println!("{}", serde_json::to_string_pretty(&report)?);
        }
    }
    Ok(())
}