use anyhow::Result;
use clap::Args;
use serde_json::Value;
use crate::cli::{open_ctx, CommonOpts};
#[derive(Debug, Args)]
pub struct AuditArgs {
#[arg(long = "paths")]
pub paths: Vec<String>,
#[arg(
long = "fail-on",
default_value = "never",
value_parser = ["high", "any", "never"],
)]
pub fail_on: String,
#[arg(long = "no-emit-tracker")]
pub no_emit_tracker: bool,
#[arg(long = "tracker-id")]
pub tracker_id: Option<String>,
#[arg(long)]
pub project: Option<std::path::PathBuf>,
#[arg(long)]
pub json: bool,
#[arg(long = "no-color")]
pub no_color: bool,
}
pub async fn run(args: AuditArgs) -> Result<()> {
let common = CommonOpts {
project: args.project.clone(),
json: args.json,
no_color: args.no_color,
};
let output = common.output();
let ctx = open_ctx(&common).await?;
let mut tool_args = serde_json::Map::new();
if !args.paths.is_empty() {
let list: Vec<Value> = args
.paths
.iter()
.map(|s| Value::String(s.clone()))
.collect();
tool_args.insert("paths".into(), Value::Array(list));
}
tool_args.insert("emit_tracker".into(), Value::Bool(!args.no_emit_tracker));
if let Some(id) = &args.tracker_id {
tool_args.insert("tracker_id".into(), Value::String(id.clone()));
}
tool_args.insert("fail_on".into(), Value::String(args.fail_on.clone()));
let v = crate::librarian::tools::audit_doc_refs::call(&ctx, Value::Object(tool_args)).await?;
let exit_code = v.get("exit_code").and_then(|x| x.as_i64()).unwrap_or(0) as i32;
crate::cli::format::print(&v, &output)?;
if exit_code != 0 {
std::process::exit(exit_code);
}
Ok(())
}