pub mod config;
pub mod inspectors;
pub mod models;
pub mod workspace;
use crate::config::{Config, OutputFormat};
use crate::inspectors::*;
use crate::workspace::Workspace;
use std::error::Error;
use std::fs::File;
use std::io::Write;
use std::path::{Path, PathBuf};
pub fn run(config: &Config) -> Result<(), Box<dyn Error>> {
let mut inspectors: Vec<Box<dyn FileInspector>> = Vec::new();
if config.inspect_packages {
inspectors.push(Box::new(PackageJsonInspector::new()));
}
if config.inspect_tests {
inspectors.push(Box::new(TestInspector::new()));
}
if config.inspect_angular {
inspectors.push(Box::new(AngularInspector::new()));
}
if config.inspect_types {
inspectors.push(Box::new(FileTypeInspector::new()));
}
if inspectors.is_empty() {
println!("No inspectors defined.\nRun 'birdview inspect --help' for available options.");
return Ok(());
}
let mut workspace = Workspace::new(config.working_dir.to_owned(), inspectors, config.verbose);
let output = workspace.inspect()?;
let output_file_path = get_output_file(&config.output_dir, config.format).unwrap();
let mut output_file = File::create(&output_file_path)?;
let json_string = serde_json::to_string_pretty(&output)?;
match &config.format {
OutputFormat::Html => {
let template = include_str!("assets/html/index.html");
let data = format!("window.data = {};", json_string);
let template = template.replace("// <birdview:DATA>", &data);
write!(output_file, "{}", template)?;
println!("Saved report to: {}", &output_file_path.display());
if config.open {
webbrowser::open(&output_file_path.display().to_string())?
}
}
OutputFormat::Json => {
write!(output_file, "{}", json_string)?;
println!("Saved report to: {}", &output_file_path.display());
}
}
println!("Inspection complete");
Ok(())
}
fn get_output_file(output_dir: &Path, format: OutputFormat) -> Option<PathBuf> {
let is_dir = output_dir.exists() && output_dir.is_dir();
if is_dir {
let extension = match format {
OutputFormat::Html => "html",
OutputFormat::Json => "json",
};
let now = chrono::offset::Local::now();
let output_file =
output_dir.join(format!("{}.{extension}", now.format("%Y-%m-%d_%H-%M-%S")));
return Some(output_file);
}
None
}