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 = ".did-signers")]
signers_file: PathBuf,
#[arg(long)]
registry_url: String,
#[arg(long)]
registry_did: String,
#[arg(long)]
authority: 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,
signers_file: cli.signers_file,
registry_url: cli.registry_url,
registry_did: cli.registry_did,
authority_did: cli.authority,
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);
}