use std::path::PathBuf;
use clap::Parser;
use rpgpie::{
certificate::Checked,
merge::CertificateInfo,
model::status_summary,
util::print_cert,
};
#[derive(Parser, Debug)]
#[command(about = "An experimental OpenPGP CLI tool", version)]
pub struct Cli {
#[command(subcommand)]
pub cmd: Command,
}
#[derive(Parser, Debug)]
pub enum Command {
Status(StatusCommand),
Show(ShowCommand),
}
#[derive(Parser, Debug)]
pub struct ShowCommand {
#[arg(help = "An OpenPGP file")]
pub file: Option<PathBuf>,
#[arg(short, long)]
pub verbose: bool,
#[arg(short, long)]
pub unordered: bool,
}
#[derive(Parser, Debug)]
pub struct StatusCommand {
#[arg(help = "An OpenPGP file")]
pub file: Option<PathBuf>,
#[arg(short, long)]
pub verbose: bool,
#[arg(long)]
pub json: bool,
}
fn main() {
let cli = Cli::parse();
match cli.cmd {
Command::Show(show) => {
let loaded = if let Some(file) = show.file {
CertificateInfo::from_file(&file)
} else {
CertificateInfo::from_reader(std::io::stdin())
};
let Ok(CertificateInfo::Cert(cert)) = loaded else {
unimplemented!("unsupported {:?}", loaded);
};
print_cert(&cert, show.verbose, !show.unordered);
}
Command::Status(status) => {
let loaded = if let Some(file) = status.file {
CertificateInfo::from_file(&file)
} else {
CertificateInfo::from_reader(std::io::stdin())
};
let Ok(CertificateInfo::Cert(cert)) = loaded else {
unimplemented!("unsupported {:?}", loaded);
};
let checked: Checked = cert.into();
let summary = status_summary(&checked);
if !status.json {
print!("{}", &summary)
} else {
let json = serde_json::to_string_pretty(&summary).unwrap();
println!("{}", json);
}
}
}
}