workspacer_cli/
coverage_crate.rs

1// ---------------- [ File: workspacer-cli/src/coverage_crate.rs ]
2crate::ix!();
3
4/// Subcommand for `ws coverage crate --crate <NAME> [--workspace ...] [--skip-git-check]`
5#[derive(Debug,StructOpt,Getters,Setters)]
6#[getset(get="pub")]
7pub struct CoverageCrateCommand {
8    /// crate name
9    #[structopt(long = "crate")]
10    crate_name: String,
11
12    /// optional workspace path
13    #[structopt(long = "workspace")]
14    workspace_path: Option<PathBuf>,
15
16    /// skip git check
17    #[structopt(long = "skip-git-check")]
18    skip_git_check: bool,
19}
20
21impl CoverageCrateCommand {
22    pub async fn run(&self) -> Result<(), WorkspaceError> {
23        let crate_name_owned = self.crate_name().clone();
24
25        run_with_workspace_and_crate_name(
26            self.workspace_path().clone(),
27            *self.skip_git_check(),
28            crate_name_owned,
29            |ws, name| {
30                Box::pin(async move {
31                    // 1) find crate by name
32                    let arc_crate = ws.find_crate_by_name(name).await.ok_or_else(|| {
33                        error!("No crate named '{}' found in workspace for coverage subcommand", name);
34                        CrateError::CrateNotFoundInWorkspace {
35                            crate_name: name.to_string(),
36                        }
37                    })?;
38
39                    // 2) lock handle
40                    let handle = arc_crate.lock().await.clone();
41
42                    // 3) run coverage for just this crate => from new trait
43                    let coverage_report = handle.run_tests_with_coverage().await?;
44
45                    info!(
46                        "Coverage for crate='{}': total_coverage={}%, covered_lines={}/{}",
47                        handle.name(),
48                        coverage_report.total_coverage(),
49                        coverage_report.covered_lines(),
50                        coverage_report.total_lines(),
51                    );
52
53                    // optionally, print or store the coverage
54                    println!(
55                        "Coverage for crate '{}' => {:.2}% (covered: {}, missed: {}, total: {})",
56                        handle.name(),
57                        coverage_report.total_coverage(),
58                        coverage_report.covered_lines(),
59                        coverage_report.missed_lines(),
60                        coverage_report.total_lines()
61                    );
62
63                    Ok(())
64                })
65            },
66        )
67        .await
68    }
69}