use clap::Args;
use zoi_common::Runnable;
use crate::cli::InstallScope;
use crate::pkg::plugin::PluginManager;
#[derive(Args, Debug, Clone)]
pub struct InstallArgs {
#[arg(
value_name = "ALL_SOURCES",
help = "Package identifier (e.g. @repo/name, #git@repo/name, path, or \
URL)"
)]
pub sources: Vec<String>,
#[arg(long, value_name = "REPO", conflicts_with = "sources")]
pub repo: Option<String>,
#[arg(long)]
pub force: bool,
#[arg(long)]
pub all_optional: bool,
#[arg(long, value_enum, conflicts_with_all = &["local", "global"])]
pub scope: Option<InstallScope>,
#[arg(long, conflicts_with = "global")]
pub local: bool,
#[arg(long)]
pub global: bool,
#[arg(long)]
pub save: bool,
#[arg(long)]
pub r#type: Option<String>,
#[arg(long)]
pub dry_run: bool,
#[arg(long, short = 'b')]
pub build: bool,
#[arg(long)]
pub frozen: bool,
#[arg(long)]
pub explain: bool,
#[arg(long)]
pub plan_json: bool,
#[arg(long, default_value_t = 3)]
pub retry: u32,
#[arg(long, short)]
pub verbose: bool,
#[arg(long)]
pub purl: bool
}
impl Runnable for InstallArgs {
fn run(&self, yes: bool) -> anyhow::Result<()> {
let plugin_manager = PluginManager::new()?;
super::run(
&self.sources,
self.repo.clone(),
self.force,
self.all_optional,
yes,
self.scope,
self.local,
self.global,
self.save,
self.r#type.as_deref(),
self.dry_run,
Some(&plugin_manager),
self.build,
self.frozen,
self.explain,
self.plan_json,
self.retry,
self.verbose,
self.purl,
None
)
}
}