qlty_cloud/export/
coverage.rs1use 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}