use std::process::Command;
use std::time::Instant;
use anyhow::Result;
use tracing::{error, info, warn};
use crate::utils::is_command_available;
fn install_yamllint() -> Result<()> {
info!("Installing yamllint...");
if is_command_available("apt-get") {
let output = Command::new("sudo").args(["apt-get", "update"]).output()?;
if !output.status.success() {
warn!("Failed to update package list");
}
let output = Command::new("sudo").args(["apt-get", "install", "-y", "yamllint"]).output()?;
if output.status.success() {
info!("yamllint installed successfully");
return Ok(());
}
} else if is_command_available("dnf") {
let output = Command::new("sudo").args(["dnf", "install", "-y", "yamllint"]).output()?;
if output.status.success() {
info!("yamllint installed successfully");
return Ok(());
}
} else if is_command_available("pacman") {
let output = Command::new("sudo")
.args(["pacman", "-S", "--noconfirm", "yamllint"])
.output()?;
if output.status.success() {
info!("yamllint installed successfully");
return Ok(());
}
} else if is_command_available("pip3") {
let output = Command::new("pip3").args(["install", "--user", "yamllint"]).output()?;
if output.status.success() {
info!("yamllint installed successfully");
return Ok(());
}
}
error!("Could not install yamllint. Please install it manually.");
Err(anyhow::anyhow!("Could not install yamllint"))
}
pub fn run_yaml_linter() -> Result<()> {
if !is_command_available("yamllint") {
install_yamllint()?;
}
let t = Instant::now();
info!(target: "yaml", "Scanning YAML files...");
let output = Command::new("yamllint").args(["-c", ".yamllint-ci.yml", "."]).output()?;
if output.status.success() {
info!(target: "yaml", "All YAML 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: "yaml", "YAML linting failed. Please fix the issues above. ({:.3}s)", t.elapsed().as_secs_f64());
Err(anyhow::anyhow!("YAML linting failed"))
}
}