use crate::cli::{
install::{install, InstallOptions},
run_on_workspace_members,
};
use clap::Args;
use pesde::{download_and_link::InstallDependenciesMode, Project};
use std::num::NonZeroUsize;
#[derive(Debug, Args, Copy, Clone)]
pub struct InstallCommand {
#[arg(long)]
locked: bool,
#[arg(long)]
prod: bool,
#[arg(long)]
dev: bool,
#[arg(long, default_value = "16")]
network_concurrency: NonZeroUsize,
#[arg(long)]
force: bool,
}
impl InstallCommand {
pub async fn run(self, project: Project, reqwest: reqwest::Client) -> anyhow::Result<()> {
let install_dependencies_mode = match (self.prod, self.dev) {
(true, true) => anyhow::bail!("cannot have both prod and dev flags enabled"),
(true, false) => InstallDependenciesMode::Prod,
(false, true) => InstallDependenciesMode::Dev,
(false, false) => InstallDependenciesMode::All,
};
let options = InstallOptions {
locked: self.locked,
install_dependencies_mode,
write: true,
network_concurrency: self.network_concurrency,
use_lockfile: true,
force: self.force,
};
install(&options, &project, reqwest.clone(), true).await?;
run_on_workspace_members(&project, |project| {
let reqwest = reqwest.clone();
async move {
install(&options, &project, reqwest, false).await?;
Ok(())
}
})
.await?;
Ok(())
}
}