Skip to main content

lux_cli/
remove.rs

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