doot/crates/doot-core/src/package/yay.rs
2026-02-05 22:35:09 -06:00

105 lines
2.4 KiB
Rust

use super::{PackageError, PackageManager};
use std::process::Command;
pub struct Yay {
dry_run: bool,
}
impl Yay {
pub fn new() -> Self {
Self { dry_run: false }
}
pub fn dry_run(mut self, dry_run: bool) -> Self {
self.dry_run = dry_run;
self
}
fn run_yay(&self, args: &[&str]) -> Result<(), PackageError> {
if self.dry_run {
println!("[dry-run] yay {}", args.join(" "));
return Ok(());
}
let output = Command::new("yay").args(args).output()?;
if !output.status.success() {
return Err(PackageError::InstallFailed {
package: args.join(" "),
message: String::from_utf8_lossy(&output.stderr).to_string(),
});
}
Ok(())
}
}
impl PackageManager for Yay {
fn name(&self) -> &'static str {
"yay"
}
fn is_available(&self) -> bool {
Command::new("yay")
.arg("--version")
.output()
.map(|o| o.status.success())
.unwrap_or(false)
}
fn needs_sudo(&self) -> bool {
// yay handles sudo internally
false
}
fn install(&self, packages: &[String]) -> Result<(), PackageError> {
if packages.is_empty() {
return Ok(());
}
let mut args = vec!["-S", "--noconfirm"];
for pkg in packages {
args.push(pkg);
}
self.run_yay(&args)
}
fn install_with_sudo(&self, packages: &[String], _password: &str) -> Result<(), PackageError> {
// yay handles sudo internally, no need for password
self.install(packages)
}
fn uninstall(&self, packages: &[String]) -> Result<(), PackageError> {
if packages.is_empty() {
return Ok(());
}
let mut args = vec!["-R", "--noconfirm"];
for pkg in packages {
args.push(pkg);
}
self.run_yay(&args)
}
fn is_installed(&self, package: &str) -> Result<bool, PackageError> {
let output = Command::new("yay").args(["-Q", package]).output()?;
Ok(output.status.success())
}
fn update(&self) -> Result<(), PackageError> {
self.run_yay(&["-Sy"])
}
fn upgrade(&self) -> Result<(), PackageError> {
self.run_yay(&["-Syu", "--noconfirm"])
}
}
impl Default for Yay {
fn default() -> Self {
Self::new()
}
}