use std::process::Command;
use std::time::Instant;
use anyhow::Result;
use tracing::{error, info};
use crate::utils::is_command_available;
fn install_taplo() -> Result<()> {
info!("Installing Taplo CLI...");
if !is_command_available("cargo") {
error!("Cargo is required to install Taplo CLI");
return Err(anyhow::anyhow!("Cargo is not available"));
}
let output = Command::new("cargo").args(["install", "taplo-cli", "--locked"]).output()?;
if output.status.success() {
info!("Taplo CLI installed successfully");
Ok(())
} else {
let stderr = String::from_utf8_lossy(&output.stderr);
error!("Failed to install Taplo CLI: {}", stderr);
Err(anyhow::anyhow!("Failed to install Taplo CLI"))
}
}
pub fn run_toml_linter() -> Result<()> {
if !is_command_available("taplo") {
install_taplo()?;
}
let t = Instant::now();
info!(target: "toml", "Scanning TOML files...");
let check_output = Command::new("taplo").args(["check", "**/*.toml"]).output()?;
if !check_output.status.success() {
let stderr = String::from_utf8_lossy(&check_output.stderr);
let stdout = String::from_utf8_lossy(&check_output.stdout);
if !stdout.is_empty() {
println!("{stdout}");
}
if !stderr.is_empty() {
eprintln!("{stderr}");
}
println!();
error!(target: "toml", "TOML linting failed. Please fix the issues above. ({:.3}s)", t.elapsed().as_secs_f64());
return Err(anyhow::anyhow!("TOML linting failed"));
}
let format_output = Command::new("taplo").args(["fmt", "--check", "**/*.toml"]).output()?;
if format_output.status.success() {
info!(target: "toml", "All TOML files passed linting and formatting checks! ({:.3}s)", t.elapsed().as_secs_f64());
Ok(())
} else {
let stderr = String::from_utf8_lossy(&format_output.stderr);
let stdout = String::from_utf8_lossy(&format_output.stdout);
if !stdout.is_empty() {
println!("{stdout}");
}
if !stderr.is_empty() {
eprintln!("{stderr}");
}
println!();
error!(target: "toml", "TOML formatting failed. Please fix the issues above. ({:.3}s)", t.elapsed().as_secs_f64());
error!(target: "toml", "Run 'taplo fmt **/*.toml' to auto-fix formatting issues.");
Err(anyhow::anyhow!("TOML formatting failed"))
}
}