mod analyzer;
mod builder;
pub(crate) mod data;
mod json;
mod markdown;
use std::error::Error;
use crate::cli::OutputMode;
use crate::walk::WalkConfig;
pub use data::*;
pub use builder::build_report;
pub fn run(
cfg: &WalkConfig<'_>,
output: OutputMode,
top: usize,
min_lines: usize,
) -> Result<(), Box<dyn Error>> {
let report = build_report(cfg, top, min_lines)?;
match output {
OutputMode::Json => json::print_json(&report)?,
OutputMode::Short => print_short(&report),
OutputMode::Terse => print_terse(&report),
OutputMode::Github | OutputMode::Codeclimate => {
return Err(crate::cli::ERR_CI_FORMAT_ONLY.into());
}
OutputMode::Table => markdown::print_markdown(&report),
}
Ok(())
}
fn print_short(report: &ProjectReport) {
let total_code: usize = report.loc.iter().map(|l| l.code).sum();
let langs = report.loc.len();
let files: usize = report.loc.iter().map(|l| l.files).sum();
println!(
"report files:{files} langs:{langs} code:{total_code} dups:{:.1}%",
report.duplication.duplication_percentage,
);
}
fn print_terse(report: &ProjectReport) {
let total_code: usize = report.loc.iter().map(|l| l.code).sum();
println!("{total_code}");
}
#[cfg(test)]
#[path = "mod_test.rs"]
mod tests;