use camino::Utf8PathBuf;
use clap::{Args, Parser, Subcommand};
use std::time::Duration;
#[derive(PartialEq, Clone, Debug, Parser)]
#[command(author, version, about, long_about = None)]
pub struct CliOpts {
#[clap(flatten)]
pub bitcoin: Option<BitcoinOpts>,
#[command(subcommand)]
pub command: CliCommand,
}
#[derive(Debug, Subcommand, Clone, PartialEq)]
#[clap(rename_all = "snake")]
pub enum CliCommand {
#[clap(long_about = "Timestamp files")]
Stamp {
#[clap(name = "files", required = true, num_args = 1.., value_delimiter = ' ')]
files: Vec<Utf8PathBuf>,
#[clap(name = "calendar_url", short, long)]
calendar: Option<Vec<String>>,
#[clap(name = "timeout", short, long)]
#[arg(value_parser = parse_duration)]
timeout: Option<Duration>,
},
#[clap(long_about = "Upgrade remote calendar timestamps to be locally verifiable")]
Upgrade {
#[clap(name = "files", required = true, num_args = 1.., value_delimiter = ' ')]
files: Vec<Utf8PathBuf>,
#[clap(name = "calendar_url", short, long)]
calendar: Option<Vec<String>>,
},
#[clap(long_about = "Show information on a timestamp")]
Info {
#[clap(name = "file", required = true, index = 1)]
file: Utf8PathBuf,
},
#[clap(long_about = "Verify a timestamp")]
Verify {
#[clap(name = "timestamp", required = true, index = 1)]
timestamp: Utf8PathBuf,
#[clap(name = "target", index = 2)]
target: Option<Utf8PathBuf>,
#[clap(name = "digest", index = 3)]
digest: Option<String>,
},
}
fn parse_duration(arg: &str) -> Result<std::time::Duration, std::num::ParseIntError> {
let seconds = arg.parse()?;
Ok(std::time::Duration::from_secs(seconds))
}
#[derive(PartialEq, Clone, Debug, Args)]
pub struct BitcoinOpts {
#[clap(long, global = true)]
pub bitcoin_node: Option<String>,
#[clap(long, global = true)]
pub bitcoin_username: Option<String>,
#[clap(long, global = true)]
pub bitcoin_password: Option<String>,
}