1use clap::Args;
2use eyre::{OptionExt, Result};
3use itertools::Itertools;
4use lux_lib::{
5 config::Config, package::PackageName, progress::MultiProgress, rockspec::lua_dependency,
6 workspace::Workspace,
7};
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_eyre("No project found")?;
35 let progress = MultiProgress::new_arc(&config);
36
37 let project = workspace.single_member_or_select_mut(&data.package)?;
38
39 if !data.depencencies.is_empty() {
40 project
41 .remove(lua_dependency::DependencyType::Regular(
42 data.depencencies.iter().collect_vec(),
43 ))
44 .await?;
45 }
46
47 let build_packages = data.build.unwrap_or_default();
48 if !build_packages.is_empty() {
49 project
50 .remove(lua_dependency::DependencyType::Build(
51 build_packages.iter().collect_vec(),
52 ))
53 .await?;
54 }
55
56 let test_packages = data.test.unwrap_or_default();
57 if !test_packages.is_empty() {
58 project
59 .remove(lua_dependency::DependencyType::Test(
60 test_packages.iter().collect_vec(),
61 ))
62 .await?;
63 }
64
65 if !data.depencencies.is_empty() {
66 sync_dependencies_if_locked(&workspace, progress.clone(), &config).await?;
67 }
68 if !build_packages.is_empty() {
69 sync_build_dependencies_if_locked(&workspace, progress.clone(), &config).await?;
70 }
71 if !test_packages.is_empty() {
72 sync_test_dependencies_if_locked(&workspace, progress.clone(), &config).await?;
73 }
74 Ok(())
75}