use std::path::PathBuf;
use clap::{ArgGroup, Args, Subcommand};
use super::fetch::ClientFetchArgs;
#[derive(Args, Debug)]
pub struct BundleArgs {
#[command(subcommand)]
pub cmd: BundleCommand,
}
#[derive(Subcommand, Debug)]
pub enum BundleCommand {
Pull(BundlePullArgs),
}
#[derive(Args, Debug)]
#[command(group(ArgGroup::new("bundle_source").required(true).args(["input", "hash"])))]
#[expect(
clippy::struct_excessive_bools,
reason = "independent CLI flags (--overwrite/--dry-run/--json/--select), not a state machine"
)]
pub struct BundlePullArgs {
#[arg(short = 'i', long, value_name = "FILE")]
pub input: Option<PathBuf>,
#[arg(long, value_name = "HASH")]
pub hash: Option<String>,
#[arg(short = 'o', long, value_name = "DIR")]
pub output: PathBuf,
#[arg(long, value_name = "N", default_value_t = 4)]
pub jobs: usize,
#[arg(
long,
value_name = "N",
default_value_t = 4,
value_parser = clap::value_parser!(u16).range(1..=64)
)]
pub max_lane_streams: u16,
#[arg(long = "include", value_name = "GLOB", action = clap::ArgAction::Append)]
pub include: Vec<String>,
#[arg(long = "exclude", value_name = "GLOB", action = clap::ArgAction::Append)]
pub exclude: Vec<String>,
#[arg(long)]
pub select: bool,
#[arg(long)]
pub overwrite: bool,
#[arg(long)]
pub dry_run: bool,
#[arg(long)]
pub json: bool,
#[arg(long, value_name = "ID", value_parser = super::fetch::parse_fetch_namespace_id)]
pub namespace: Option<u64>,
#[command(flatten)]
pub common: ClientFetchArgs,
}