use anyhow::{Context, Result};
use clap::Parser;
use std::path::PathBuf;
use verify_trust::{VerifyTrustArgs, handle_verify_trust};
#[derive(Parser)]
#[command(
name = "verify-trust",
about = "Verify a git commit range against a VTC Trust Registry",
version
)]
struct Cli {
#[arg(long)]
range: String,
#[arg(long, default_value_t = 32)]
max_signers: usize,
#[arg(long)]
registry_url: Option<String>,
#[arg(long)]
registry_did: String,
#[arg(long)]
vtc_did: String,
#[arg(long, default_value = "git.commit.sign")]
action: String,
#[arg(long)]
resource: Option<String>,
#[arg(long)]
fallback_resource: Option<String>,
#[arg(long)]
exempt_keyring: Option<PathBuf>,
#[arg(long)]
repo_dir: Option<PathBuf>,
#[arg(long)]
resolve_agent_names: bool,
#[arg(long)]
json: bool,
}
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
.with_writer(std::io::stderr)
.init();
let cli = Cli::parse();
let resource = cli
.resource
.or_else(|| std::env::var("GITHUB_REPOSITORY").ok())
.context("--resource is required (or set GITHUB_REPOSITORY)")?;
let repo_dir = match cli.repo_dir {
Some(dir) => dir,
None => std::env::current_dir().context("cannot determine current directory")?,
};
let code = handle_verify_trust(VerifyTrustArgs {
repo_dir,
range: cli.range,
max_signers: cli.max_signers,
registry_url: cli.registry_url,
registry_did: cli.registry_did,
vtc_did: cli.vtc_did,
action: cli.action,
resource,
fallback_resource: cli.fallback_resource,
exempt_keyring: cli.exempt_keyring,
resolve_agent_names: cli.resolve_agent_names,
json: cli.json,
})
.await?;
std::process::exit(code);
}