1use clap::Args;
2use eyre::{OptionExt, Result};
3use lux_lib::{
4 config::Config, package::PackageName, progress::MultiProgress, project::Project,
5 rockspec::lua_dependency,
6};
7
8use crate::utils::project::{
9 sync_build_dependencies_if_locked, sync_dependencies_if_locked,
10 sync_test_dependencies_if_locked,
11};
12
13#[derive(Args)]
14pub struct Remove {
15 package: Vec<PackageName>,
17
18 #[arg(short, long, alias = "dev", visible_short_aliases = ['d', 'b'])]
21 build: Option<Vec<PackageName>>,
22
23 #[arg(short, long)]
25 test: Option<Vec<PackageName>>,
26}
27
28pub async fn remove(data: Remove, config: Config) -> Result<()> {
29 let mut project = Project::current()?.ok_or_eyre("No project found")?;
30 let progress = MultiProgress::new_arc();
31
32 if !data.package.is_empty() {
33 project
34 .remove(lua_dependency::DependencyType::Regular(data.package))
35 .await?;
36 sync_dependencies_if_locked(&project, progress.clone(), &config).await?;
37 }
38
39 let build_packages = data.build.unwrap_or_default();
40 if !build_packages.is_empty() {
41 project
42 .remove(lua_dependency::DependencyType::Build(build_packages))
43 .await?;
44 sync_build_dependencies_if_locked(&project, progress.clone(), &config).await?;
45 }
46
47 let test_packages = data.test.unwrap_or_default();
48 if !test_packages.is_empty() {
49 project
50 .remove(lua_dependency::DependencyType::Test(test_packages))
51 .await?;
52 sync_test_dependencies_if_locked(&project, progress.clone(), &config).await?;
53 }
54
55 Ok(())
56}