tracel-xtask 4.18.3

Reusable and Extensible xtask commands to manage repositories.
Documentation
use anyhow::Ok;
use strum::IntoEnumIterator;
use tracel_xtask_utils::{
    endgroup,
    environment::Environment,
    group,
    process::{run_process_for_package, run_process_for_workspace},
    workspace::{WorkspaceMemberType, get_workspace_members},
};

use crate::context::Context;

use super::Target;

#[tracel_xtask_macros::declare_command_args(Target, None)]
pub struct CleanCmdArgs {}

pub fn handle_command(args: CleanCmdArgs, _env: Environment, _ctx: Context) -> anyhow::Result<()> {
    run_clean(&args.target, &args)
}

pub(crate) fn run_clean(target: &Target, args: &CleanCmdArgs) -> anyhow::Result<()> {
    match target {
        Target::Workspace => {
            group!("Clean Workspace");
            let cmd_args = vec!["clean", "--color", "always"];
            run_process_for_workspace(
                "cargo",
                &cmd_args,
                None,
                &args.exclude,
                None,
                None,
                "Workspace clean failed",
                None,
                None,
            )?;
            endgroup!();
        }
        Target::Crates | Target::Examples => {
            let members = match args.target {
                Target::Crates => get_workspace_members(WorkspaceMemberType::Crate),
                Target::Examples => get_workspace_members(WorkspaceMemberType::Example),
                _ => unreachable!(),
            };

            for member in members {
                let cmd_args = vec!["clean", "-p", &member.name, "--color", "always"];
                run_process_for_package(
                    "cargo",
                    &member.name,
                    &cmd_args,
                    None,
                    &args.exclude,
                    &args.only,
                    &format!("Build command failed for {}", &member.name),
                    None,
                    None,
                )?;
                endgroup!();
            }
        }
        Target::AllPackages => {
            Target::iter()
                .filter(|t| *t != Target::AllPackages && *t != Target::Workspace)
                .try_for_each(|t| run_clean(&t, args))?;
        }
    }
    Ok(())
}