use anyhow::Result;
use clap::{Args, Parser, Subcommand};
use std::path::PathBuf;
mod cmd_hash;
mod cmd_keygen;
mod cmd_manifest_show;
mod cmd_sign;
mod cmd_verify;
#[derive(Parser, Debug)]
#[command(name = "kx_fides_cli", version, about)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand, Debug)]
enum Commands {
Keygen(KeygenArgs),
Hash(HashArgs),
Sign(SignArgs),
Verify(VerifyArgs),
Manifest(ManifestCmd),
}
#[derive(Args, Debug)]
struct KeygenArgs {
#[arg(long, value_name = "FILE")]
out: PathBuf,
}
#[derive(Args, Debug)]
struct HashArgs {
#[arg(value_name = "MEDIA")]
media: PathBuf,
}
#[derive(Args, Debug)]
struct SignArgs {
#[arg(value_name = "MEDIA")]
media: PathBuf,
#[arg(long, value_name = "KEY_JSON")]
key: PathBuf,
#[arg(long, value_name = "MANIFEST_JSON")]
out: PathBuf,
#[arg(long)]
mime: Option<String>,
}
#[derive(Args, Debug)]
struct VerifyArgs {
#[arg(value_name = "MEDIA")]
media: PathBuf,
#[arg(value_name = "MANIFEST_JSON")]
manifest: PathBuf,
}
#[derive(Subcommand, Debug)]
enum ManifestSub {
Show(ManifestShowArgs),
}
#[derive(Args, Debug)]
struct ManifestShowArgs {
#[arg(value_name = "MANIFEST_JSON")]
manifest: PathBuf,
}
#[derive(Args, Debug)]
struct ManifestCmd {
#[command(subcommand)]
action: ManifestSub,
}
fn main() -> Result<()> {
let cli = Cli::parse();
match cli.command {
Commands::Keygen(args) => cmd_keygen::run(args),
Commands::Hash(args) => cmd_hash::run(args),
Commands::Sign(args) => cmd_sign::run(args),
Commands::Verify(args) => cmd_verify::run(args),
Commands::Manifest(cmd) => match cmd.action {
ManifestSub::Show(args) => cmd_manifest_show::run(args),
},
}
}