use std::path::PathBuf;
use anyhow::Result;
use clap::Args;
use tldr_core::quality::maintainability::{maintainability_index, MaintainabilityReport};
use tldr_core::{detect_or_parse_language, validate_file_path, Language};
use crate::commands::daemon_router::{params_with_path, try_daemon_route};
use crate::output::{format_maintainability_text, OutputFormat, OutputWriter};
#[derive(Debug, Args)]
pub struct MaintainabilityArgs {
#[arg(default_value = ".")]
pub path: PathBuf,
#[arg(long, short = 'H')]
pub halstead: bool,
#[arg(long, short = 'l')]
pub lang: Option<Language>,
}
impl MaintainabilityArgs {
pub fn run(&self, format: OutputFormat, quiet: bool) -> Result<()> {
let writer = OutputWriter::new(format, quiet);
let validated_path = validate_file_path(
self.path.to_str().unwrap_or_default(),
None,
)?;
if let Some(report) = try_daemon_route::<MaintainabilityReport>(
&validated_path,
"maintainability",
params_with_path(Some(&validated_path)),
) {
writer.progress(&format!(
"Analyzed {} files, average MI: {:.1} (grade: {})",
report.summary.files_analyzed,
report.summary.average_mi,
grade_from_mi(report.summary.average_mi)
));
if writer.is_text() {
writer.write_text(&format_maintainability_text(&report))?;
} else {
writer.write(&report)?;
}
return Ok(());
}
let language = if let Some(ref lang) = self.lang {
Some(detect_or_parse_language(
Some(lang.as_str()),
&validated_path,
)?)
} else {
None
};
writer.progress(&format!(
"Calculating Maintainability Index for {}...",
validated_path.display()
));
let report = maintainability_index(&validated_path, self.halstead, language)?;
writer.progress(&format!(
"Analyzed {} files, average MI: {:.1} (grade: {})",
report.summary.files_analyzed,
report.summary.average_mi,
grade_from_mi(report.summary.average_mi)
));
if writer.is_text() {
writer.write_text(&format_maintainability_text(&report))?;
} else {
writer.write(&report)?;
}
Ok(())
}
}
fn grade_from_mi(mi: f64) -> char {
if mi > 85.0 {
'A'
} else if mi > 65.0 {
'B'
} else if mi > 45.0 {
'C'
} else if mi > 25.0 {
'D'
} else {
'F'
}
}