use std::path::PathBuf;
use clap::{Args, Parser, Subcommand, ValueEnum};
#[derive(Debug, Parser)]
#[command(
name = "mbrkit",
version,
about = "Build and inspect MBR-backed disk images"
)]
pub struct Cli {
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Pack(PackArgs),
Inspect(InspectArgs),
Extract(ExtractArgs),
Verify(VerifyArgs),
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub enum OutputFormat {
Table,
Json,
}
#[derive(Debug, Args)]
pub struct PackArgs {
#[arg(long, value_name = "FILE", conflicts_with_all = [
"output",
"disk_size",
"boot_code",
"disk_signature",
"align",
"partition"
])]
pub manifest: Option<PathBuf>,
#[arg(short, long, value_name = "FILE", required_unless_present = "manifest")]
pub output: Option<PathBuf>,
#[arg(long, value_name = "SIZE", required_unless_present = "manifest")]
pub disk_size: Option<String>,
#[arg(long, value_name = "FILE")]
pub boot_code: Option<PathBuf>,
#[arg(long, value_name = "HEX_OR_DECIMAL")]
pub disk_signature: Option<String>,
#[arg(long, value_name = "SECTORS", default_value_t = 2048)]
pub align: u64,
#[arg(long, value_name = "SPEC", required_unless_present = "manifest")]
pub partition: Vec<String>,
#[arg(long)]
pub dry_run: bool,
#[arg(long)]
pub force: bool,
}
#[derive(Debug, Args)]
pub struct InspectArgs {
#[arg(value_name = "DISK")]
pub disk: PathBuf,
#[arg(long, value_enum, default_value_t = OutputFormat::Table)]
pub format: OutputFormat,
}
#[derive(Debug, Args)]
pub struct ExtractArgs {
#[arg(value_name = "DISK")]
pub disk: PathBuf,
#[arg(long, value_name = "INDEX")]
pub partition: usize,
#[arg(short, long, value_name = "FILE")]
pub output: PathBuf,
#[arg(long)]
pub force: bool,
}
#[derive(Debug, Args)]
pub struct VerifyArgs {
#[arg(value_name = "DISK")]
pub disk: PathBuf,
#[arg(long, value_enum, default_value_t = OutputFormat::Table)]
pub format: OutputFormat,
#[arg(long)]
pub strict: bool,
}