use clap::{Args, Parser, Subcommand, ValueEnum};
use clap_complete::Shell;
use std::{path::PathBuf, str::FromStr};
#[derive(ValueEnum, Debug, Clone, Copy, Default)]
pub enum RPMBuilder {
#[default]
Mock,
Rpmbuild,
}
#[derive(Copy, Clone, ValueEnum, Debug)]
pub enum PackageType {
Rpm,
Docker,
Podman,
Flatpak,
RpmOstree,
All,
}
impl FromStr for PackageType {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"rpm" => Ok(PackageType::Rpm),
"docker" => Ok(PackageType::Docker),
"podman" => Ok(PackageType::Podman),
"flatpak" => Ok(PackageType::Flatpak),
"rpm-ostree" => Ok(PackageType::RpmOstree),
"all" => Ok(PackageType::All),
_ => Err(format!("Invalid package type: {s}")),
}
}
}
#[derive(Parser, Debug)]
#[clap(about, version)]
pub struct Cli {
#[clap(subcommand)]
pub command: Command,
#[clap(default_value = "anda.hcl", short, long, env = "ANDA_CONFIG")]
pub config: PathBuf,
#[clap(flatten)]
pub verbose: clap_verbosity_flag::Verbosity,
#[clap(short, long, env = "TARGET_DIR", default_value = "anda-build")]
pub target_dir: PathBuf,
}
#[derive(Args, Debug, Clone, Default)]
pub struct FlatpakOpts {
#[clap(long, group = "extra-source")]
pub flatpak_extra_sources: Vec<String>,
#[clap(long)]
pub flatpak_extra_sources_url: Vec<String>,
#[clap(long, action)]
pub flatpak_dont_delete_build_dir: bool,
}
#[derive(Args, Debug, Clone, Default)]
pub struct OciOpts {
#[clap(long)]
pub label: Vec<String>,
#[clap(long)]
pub build_arg: Vec<String>,
#[clap(long, action)]
pub compress: bool,
}
#[derive(Args, Debug, Clone, Default)]
pub struct RpmOpts {
#[clap(long, action)]
pub no_mirrors: bool,
#[clap(long, short, value_enum, default_value = "mock")]
pub rpm_builder: RPMBuilder,
#[clap(short = 'D', long)]
pub rpm_macro: Vec<String>,
#[clap(long, short = 'c')]
pub mock_config: Option<String>,
#[clap(long, short = 'R')]
pub extra_repos: Vec<String>,
}
#[derive(Subcommand, Debug, Clone)]
#[allow(clippy::large_enum_variant)]
pub enum Command {
Build {
#[clap(short, long, action)]
all: bool,
#[clap()]
project: Option<String>,
#[clap(short, long, value_enum, default_value = "all")]
package: PackageType,
#[clap(flatten)]
rpm_opts: RpmOpts,
#[clap(flatten)]
flatpak_opts: FlatpakOpts,
#[clap(flatten)]
oci_opts: OciOpts,
},
Clean,
List,
Init {
#[clap(default_value = ".")]
path: PathBuf,
#[clap(short, long, action)]
yes: bool,
},
Completion {
#[clap(value_enum)]
shell: Shell,
},
CI,
Update {
#[clap(short, long)]
labels: Option<String>,
#[clap(short, long)]
filters: Option<String>,
},
Run {
scripts: Vec<String>,
#[clap(short, long)]
labels: Option<String>,
},
}