1mod data;
5mod iter;
6mod series;
7
8use std::fs;
9use std::path::Path;
10use std::path::PathBuf;
11
12use mprobe_diagnostics::DiagnosticData;
13
14use crate::error::Result;
15use crate::layout::data::DataEngine;
16use crate::layout::iter::ErrorHandlingIter;
17use crate::template::TemplateEngine;
18
19pub struct VisLayout {
39 index_file_path: PathBuf,
40 views_path: PathBuf,
41 data_path: PathBuf,
42}
43
44impl VisLayout {
45 const MAIN_DIR_NAME: &str = "vis";
46 const DATA_DIR_NAME: &str = "data";
47 const VIEWS_DIR_NAME: &str = "views";
48 const INDEX_FILE_NAME: &str = "index.html";
49
50 pub fn init(path: &Path) -> Result<VisLayout> {
53 let root_path = path.join(Self::MAIN_DIR_NAME);
54 let index_file_path = root_path.join(Self::INDEX_FILE_NAME);
55 let data_path = root_path.join(Self::DATA_DIR_NAME);
56 let views_path = root_path.join(Self::VIEWS_DIR_NAME);
57
58 if root_path.exists() {
59 fs::remove_dir_all(&root_path)?;
60 }
61 fs::create_dir(&root_path)?;
62
63 Ok(Self {
64 data_path,
65 index_file_path,
66 views_path,
67 })
68 }
69
70 pub fn generate_report(&self, diagnostic_data: DiagnosticData) -> Result<()> {
72 let mut data_engine = DataEngine::new(&self.data_path);
73 let metrics = ErrorHandlingIter::new(diagnostic_data.into_iter());
74 let charts = data_engine.render(metrics)?;
75
76 let template = TemplateEngine::new(&self.index_file_path, &self.views_path);
77 template.render(&charts)
78 }
79}