qlty_cloud/export/
analysis.rs

1use crate::format::{GzFormatter, JsonEachRowFormatter, JsonFormatter};
2use anyhow::Result;
3use qlty_analysis::Report;
4use std::path::{Path, PathBuf};
5use tracing::info;
6
7#[derive(Default, Debug)]
8pub struct AnalysisExport {
9    pub report: Report,
10    pub path: PathBuf,
11    pub gzip: bool,
12}
13
14impl AnalysisExport {
15    pub fn new(report: &Report, path: &Path, gzip: bool) -> Self {
16        Self {
17            report: report.clone(),
18            path: path.to_path_buf(),
19            gzip,
20        }
21    }
22
23    pub fn export(&self) -> Result<()> {
24        info!("Exporting analysis to: {}", self.path.display());
25        std::fs::create_dir_all(&self.path)?;
26
27        if self.gzip {
28            self.export_json_gz()
29        } else {
30            self.export_json()
31        }
32    }
33
34    fn export_json(&self) -> Result<()> {
35        JsonFormatter::new(self.report.metadata.clone())
36            .write_to_file(&self.path.join("metadata.json"))?;
37
38        JsonEachRowFormatter::new(self.report.messages.clone())
39            .write_to_file(&self.path.join("messages.jsonl"))?;
40
41        JsonEachRowFormatter::new(self.report.invocations.clone())
42            .write_to_file(&self.path.join("invocations.jsonl"))?;
43
44        JsonEachRowFormatter::new(self.report.issues.clone())
45            .write_to_file(&self.path.join("issues.jsonl"))?;
46
47        JsonEachRowFormatter::new(self.report.stats.clone())
48            .write_to_file(&self.path.join("stats.jsonl"))
49    }
50
51    fn export_json_gz(&self) -> Result<()> {
52        JsonFormatter::new(self.report.metadata.clone())
53            .write_to_file(&self.path.join("metadata.json"))?;
54
55        GzFormatter::new(JsonEachRowFormatter::new(self.report.messages.clone()))
56            .write_to_file(&self.path.join("messages.json.gz"))?;
57
58        GzFormatter::new(JsonEachRowFormatter::new(self.report.invocations.clone()))
59            .write_to_file(&self.path.join("invocations.json.gz"))?;
60
61        GzFormatter::new(JsonEachRowFormatter::new(self.report.issues.clone()))
62            .write_to_file(&self.path.join("issues.json.gz"))?;
63
64        GzFormatter::new(JsonEachRowFormatter::new(self.report.stats.clone()))
65            .write_to_file(&self.path.join("stats.json.gz"))
66    }
67}