use crate::manager::{PackageError, PackageManager, RunOutcome, Runner};
pub struct Pacman;
impl Pacman {
fn binary(&self) -> &'static str {
if which::which("paru").is_ok() {
"paru"
} else {
"pacman"
}
}
}
impl PackageManager for Pacman {
fn name(&self) -> &'static str {
"pacman"
}
fn is_available(&self) -> bool {
which::which("pacman").is_ok()
}
fn is_installed(&self, runner: &dyn Runner, pkg: &str) -> Result<bool, PackageError> {
let RunOutcome { status, .. } = runner.run("pacman", &["-Q", pkg])?;
match status {
0 => Ok(true),
_ => Ok(false),
}
}
fn install(&self, runner: &dyn Runner, packages: &[String]) -> Result<(), PackageError> {
let bin = self.binary();
let mut args = vec![bin, "-S", "--noconfirm"];
let pkg_refs: Vec<&str> = packages.iter().map(String::as_str).collect();
args.extend_from_slice(&pkg_refs);
let RunOutcome { status, stderr, .. } = runner.run("sudo", &args)?;
if status != 0 {
return Err(PackageError::ExitFailure { status, stderr });
}
Ok(())
}
}