qlty_coverage/transform/
processor.rs

1use 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 mut file_coverages = vec![];
19        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}