1use std::process::Command;
2
3use anyhow::Result;
4use tracing::{error, info};
5
6#[must_use]
12pub fn is_command_available(command: &str) -> bool {
13 Command::new("which")
14 .arg(command)
15 .output()
16 .is_ok_and(|output| output.status.success())
17}
18
19pub fn install_npm_tool(tool: &str) -> Result<()> {
25 info!("Installing {tool}...");
26
27 let output = Command::new("npm").args(["install", "-g", tool]).output()?;
28
29 if output.status.success() {
30 info!("{tool} installed successfully");
31 Ok(())
32 } else {
33 let stderr = String::from_utf8_lossy(&output.stderr);
34 error!("Failed to install {tool}: {stderr}");
35 Err(anyhow::anyhow!("Failed to install {tool}"))
36 }
37}