qlty_coverage/transform/
processor.rs1use crate::formats::{parser_for, Formats};
2use crate::transform::Plan;
3use anyhow::{bail, Result};
4use qlty_types::tests::v1::FileCoverage;
5use std::path::PathBuf;
6use std::str::FromStr;
7
8pub struct Processor {
9 plan: Plan,
10}
11
12impl Processor {
13 pub fn new(plan: &Plan) -> Self {
14 Self { plan: plan.clone() }
15 }
16
17 pub fn compute(&self) -> Result<Vec<FileCoverage>> {
18 let report_file_path = PathBuf::from(&self.plan.report_file.path);
20
21 if !report_file_path.exists() {
22 bail!(
23 "Coverage report file not found: {}",
24 report_file_path.display()
25 );
26 }
27
28 let format = Formats::from_str(&self.plan.report_file.format)?;
29 let parser = parser_for(&format);
30 let file_coverages = parser.parse_file(&report_file_path)?;
31
32 let result = file_coverages
33 .iter()
34 .filter_map(|file_coverage| self.transform(file_coverage.to_owned()))
35 .collect::<Vec<_>>();
36
37 Ok(result)
38 }
39
40 fn transform(&self, file_coverage: FileCoverage) -> Option<FileCoverage> {
41 let mut file_coverage: Option<FileCoverage> = Some(file_coverage.clone());
42
43 for transformer in self.plan.transformers.iter() {
44 if file_coverage.is_some() {
45 file_coverage = transformer.transform(file_coverage.unwrap());
46 } else {
47 return None;
48 }
49 }
50
51 file_coverage
52 }
53}