es_fluent_cli/commands/
clean.rs

1//! Clean command implementation.
2
3use crate::commands::{
4    WorkspaceArgs, WorkspaceCrates, parallel_generate, render_generation_results,
5};
6use crate::core::{CliError, GenerationAction};
7use crate::utils::ui;
8use clap::Parser;
9use colored::Colorize as _;
10
11/// Arguments for the clean command.
12#[derive(Parser)]
13pub struct CleanArgs {
14    #[command(flatten)]
15    pub workspace: WorkspaceArgs,
16
17    /// Clean all locales, not just the fallback language.
18    #[arg(long)]
19    pub all: bool,
20
21    /// Dry run - show what would be cleaned without making changes.
22    #[arg(long)]
23    pub dry_run: bool,
24}
25
26/// Run the clean command.
27pub fn run_clean(args: CleanArgs) -> Result<(), CliError> {
28    let workspace = WorkspaceCrates::discover(args.workspace)?;
29
30    if !workspace.print_discovery(ui::print_header) {
31        return Ok(());
32    }
33
34    let action = GenerationAction::Clean {
35        all_locales: args.all,
36        dry_run: args.dry_run,
37    };
38
39    let results = parallel_generate(&workspace.workspace_info, &workspace.valid, &action);
40    let has_errors = render_generation_results(
41        &results,
42        |result| {
43            if args.dry_run {
44                if let Some(output) = &result.output {
45                    print!("{}", output);
46                } else if result.changed {
47                    println!(
48                        "{} {} ({} resources)",
49                        format!("{} would be cleaned in", result.name).yellow(),
50                        humantime::format_duration(result.duration)
51                            .to_string()
52                            .green(),
53                        result.resource_count.to_string().cyan()
54                    );
55                } else {
56                    println!("{} {}", "Unchanged:".dimmed(), result.name.bold());
57                }
58            } else if result.changed {
59                ui::print_cleaned(&result.name, result.duration, result.resource_count);
60            } else {
61                println!("{} {}", "Unchanged:".dimmed(), result.name.bold());
62            }
63        },
64        |result| ui::print_generation_error(&result.name, result.error.as_ref().unwrap()),
65    );
66
67    if has_errors {
68        std::process::exit(1);
69    }
70
71    Ok(())
72}