use std::fs; use std::io; use anyhow::{anyhow, Context, Result}; use clap::{Arg, ArgAction}; fn main() -> Result<()> { let matches = clap::command!() .arg( Arg::new("keyring") .long("keyring") .value_name("FILE") .num_args(1) .required(true) .action(ArgAction::Append) .help("take the keys from the keyring FILE"), ) .arg( Arg::new("FILES") .required(true) .num_args(1) .action(ArgAction::Append) .index(1) .help("files to verify"), ) .get_matches(); let mut keyring = gpgrv::Keyring::new(); for path in matches.get_raw("keyring").expect("required arg") { keyring .append_keys_from( fs::File::open(path).with_context(|| anyhow!("opening keyring {:?}", path))?, ) .with_context(|| format!("reading keyring {:?}", path))?; } for &key in keyring.key_ids() { println!("loaded key: {:016x}", key); } for file in matches.get_raw("FILES").expect("required arg") { gpgrv::verify_message( io::BufReader::new( fs::File::open(file).with_context(|| anyhow!("opening input file {:?}", file))?, ), iowrap::Ignore::new(), &keyring, ) .with_context(|| anyhow!("verifying input file {:?}", file))?; } Ok(()) }