use anyhow::bail;
use clap::Parser;
use crate::{
cmd::{self, Execute},
id::IdVersionReq,
};
#[derive(Clone, Debug, Parser)]
pub struct Add {
#[arg(value_name = "<PACKAGE>[@<VERSION_REQ>]", required = true)]
pub req: Vec<IdVersionReq>,
#[arg(short = 'r', long = "override")]
pub overwrite: bool,
#[arg(short, long, default_value_t = true)]
pub install: bool,
}
impl Execute for Add {
async fn execute(self, lib: &crate::Creeper) -> anyhow::Result<()> {
let mut pack = lib.game_pack().await?;
for IdVersionReq { id, version_req } in self.req {
if let Some(exist) = pack.node.dep.insert(id.clone(), version_req.clone()) {
if !self.overwrite {
bail!(
"cannot add {id}@{version_req}: {id}@{exist} already exists in the manifest, use --override to override"
);
}
}
}
lib.set_game_pack(pack).await?;
let install = cmd::Install { update: true };
lib.execute(install).await?;
Ok(())
}
}