1use clap::Args;
2use itertools::Itertools;
3use lux_lib::{
4 config::Config, package::PackageName, rockspec::lua_dependency, workspace::Workspace,
5};
6
7use miette::{miette, Result};
8
9use crate::workspace::{
10 sync_build_dependencies_if_locked, sync_dependencies_if_locked,
11 sync_test_dependencies_if_locked,
12};
13
14#[derive(Args)]
15pub struct Remove {
16 depencencies: Vec<PackageName>,
18
19 #[arg(short, long, alias = "dev", visible_short_aliases = ['d', 'b'])]
22 build: Option<Vec<PackageName>>,
23
24 #[arg(short, long)]
26 test: Option<Vec<PackageName>>,
27
28 #[arg(short, long, visible_short_alias = 'p')]
30 package: Option<PackageName>,
31}
32
33pub async fn remove(data: Remove, config: Config) -> Result<()> {
34 let mut workspace = Workspace::current()?.ok_or_else(|| miette!("No project found"))?;
35
36 let project = workspace.single_member_or_select_mut(&data.package)?;
37
38 if !data.depencencies.is_empty() {
39 project
40 .remove(lua_dependency::DependencyType::Regular(
41 data.depencencies.iter().collect_vec(),
42 ))
43 .await?;
44 }
45
46 let build_packages = data.build.unwrap_or_default();
47 if !build_packages.is_empty() {
48 project
49 .remove(lua_dependency::DependencyType::Build(
50 build_packages.iter().collect_vec(),
51 ))
52 .await?;
53 }
54
55 let test_packages = data.test.unwrap_or_default();
56 if !test_packages.is_empty() {
57 project
58 .remove(lua_dependency::DependencyType::Test(
59 test_packages.iter().collect_vec(),
60 ))
61 .await?;
62 }
63
64 if !data.depencencies.is_empty() {
65 sync_dependencies_if_locked(&workspace, &config).await?;
66 }
67 if !build_packages.is_empty() {
68 sync_build_dependencies_if_locked(&workspace, &config).await?;
69 }
70 if !test_packages.is_empty() {
71 sync_test_dependencies_if_locked(&workspace, &config).await?;
72 }
73 Ok(())
74}