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(())
}