use std::env;
use std::process::Command;
use std::time::Instant;
use anyhow::Result;
use tracing::{error, info};
use crate::utils::{install_npm_tool, is_command_available};
pub fn run_markdown_linter() -> Result<()> {
if !is_command_available("markdownlint") {
install_npm_tool("markdownlint-cli")?;
}
let repo_root = env::current_dir()?;
let config_path = repo_root.join(".markdownlint.json");
let t = Instant::now();
info!(target: "markdown", "Scanning markdown files...");
let find_output = Command::new("find")
.current_dir(&repo_root)
.args([
".",
"-name",
"*.md",
"-type",
"f",
"-not",
"-path",
"*/.terraform/*",
"-not",
"-path",
"./target/*",
])
.output()?;
if !find_output.status.success() {
error!(target: "markdown", "Failed to find markdown files");
return Err(anyhow::anyhow!("Failed to find markdown files"));
}
let files = String::from_utf8_lossy(&find_output.stdout);
let file_list: Vec<&str> = files.lines().filter(|s| !s.is_empty()).collect();
let mut cmd = Command::new("markdownlint");
cmd.current_dir(&repo_root);
cmd.arg("--config").arg(&config_path);
cmd.arg("--dot"); cmd.args(&file_list);
let output = cmd.output()?;
if output.status.success() {
info!(target: "markdown", "All markdown files passed linting! ({:.3}s)", t.elapsed().as_secs_f64());
Ok(())
} else {
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
if !stdout.is_empty() {
println!("{stdout}");
}
if !stderr.is_empty() {
eprintln!("{stderr}");
}
println!();
error!(target: "markdown", "Markdown linting failed. Please fix the issues above. ({:.3}s)", t.elapsed().as_secs_f64());
Err(anyhow::anyhow!("Markdown linting failed"))
}
}