workspacer_cli/
coverage_crate.rs1crate::ix!();
3
4#[derive(Debug,StructOpt,Getters,Setters)]
6#[getset(get="pub")]
7pub struct CoverageCrateCommand {
8 #[structopt(long = "crate")]
10 crate_name: String,
11
12 #[structopt(long = "workspace")]
14 workspace_path: Option<PathBuf>,
15
16 #[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 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 let handle = arc_crate.lock().await.clone();
41
42 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 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}