Skip to main content

lux_cli/
remove.rs

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    /// Package or list of packages to remove from the dependencies.
17    depencencies: Vec<PackageName>,
18
19    /// Remove a development dependency.
20    /// Also called `dev`.
21    #[arg(short, long, alias = "dev", visible_short_aliases = ['d', 'b'])]
22    build: Option<Vec<PackageName>>,
23
24    /// Remove a test dependency.
25    #[arg(short, long)]
26    test: Option<Vec<PackageName>>,
27
28    /// Package to remove from.
29    #[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}