qlty_cloud/export/
coverage.rs

1use crate::format::{GzFormatter, JsonEachRowFormatter, JsonFormatter};
2use anyhow::{Context, Result};
3use qlty_types::tests::v1::{CoverageMetadata, FileCoverage, ReportFile};
4use std::fs::File;
5use std::io::Read;
6use std::path::{Path, PathBuf};
7
8#[derive(Debug, Clone, Default)]
9pub struct CoverageExport {
10    pub metadata: CoverageMetadata,
11    pub report_files: Vec<ReportFile>,
12    pub file_coverages: Vec<FileCoverage>,
13    pub to: Option<PathBuf>,
14}
15
16impl CoverageExport {
17    pub fn export_to(&mut self, directory: Option<PathBuf>) -> Result<()> {
18        self.to = Some(directory.unwrap_or_else(|| PathBuf::from("tmp/qlty-coverage")));
19        self.export()
20    }
21
22    fn export(&self) -> Result<()> {
23        let directory = self.to.as_ref().unwrap();
24
25        GzFormatter::new(JsonEachRowFormatter::new(self.report_files.clone()))
26            .write_to_file(&directory.join("report_files.json.gz"))?;
27
28        GzFormatter::new(JsonEachRowFormatter::new(self.file_coverages.clone()))
29            .write_to_file(&directory.join("file_coverages.json.gz"))?;
30
31        JsonFormatter::new(self.metadata.clone()).write_to_file(&directory.join("metadata.json"))
32    }
33
34    pub fn total_size_bytes(&self) -> Result<u64> {
35        let mut bytes: u64 = 0;
36
37        bytes += self.read_file("report_files.json.gz")?.len() as u64;
38        bytes += self.read_file("file_coverages.json.gz")?.len() as u64;
39        bytes += self.read_file("metadata.json")?.len() as u64;
40
41        Ok(bytes)
42    }
43
44    pub fn read_file<P: AsRef<Path>>(&self, filename: P) -> Result<Vec<u8>> {
45        let path = self.to.as_ref().unwrap().join(filename.as_ref());
46        let mut file =
47            File::open(&path).with_context(|| format!("Failed to open file: {:?}", path))?;
48
49        let mut buffer = Vec::new();
50
51        file.read_to_end(&mut buffer)
52            .with_context(|| format!("Failed to read file: {:?}", path))?;
53
54        Ok(buffer)
55    }
56}