use structopt; use gpgme::{Context, Protocol}; use std::{ error::Error, fs::File, io::{self, prelude::*}, path::PathBuf, }; use structopt::StructOpt; #[derive(Debug, StructOpt)] struct Cli { #[structopt(long)] /// Use the CMS protocol cms: bool, #[structopt(parse(from_os_str))] /// File to decrypt filename: PathBuf, } fn main() -> Result<(), Box> { let args = Cli::from_args(); let proto = if args.cms { Protocol::Cms } else { Protocol::OpenPgp }; let mut ctx = Context::from_protocol(proto)?; let mut input = File::open(&args.filename)?; let mut output = Vec::new(); ctx.decrypt(&mut input, &mut output) .map_err(|e| format!("decrypting failed: {:?}", e))?; println!("Begin Output:"); io::stdout().write_all(&output)?; println!("End Output."); Ok(()) }