Skip to main content

lux_cli/
remove.rs

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    /// 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_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}