Skip to main content

krypt_pkg/
brew.rs

1//! `brew` package manager implementation (macOS Homebrew).
2
3use crate::manager::{PackageError, PackageManager, RunOutcome, Runner};
4
5/// Package manager implementation for macOS (Homebrew).
6pub struct Brew;
7
8impl PackageManager for Brew {
9    fn name(&self) -> &'static str {
10        "brew"
11    }
12
13    fn is_available(&self) -> bool {
14        which::which("brew").is_ok()
15    }
16
17    fn is_installed(&self, runner: &dyn Runner, pkg: &str) -> Result<bool, PackageError> {
18        let RunOutcome { status, stdout, .. } =
19            runner.run("brew", &["list", "--formula", "--versions", pkg])?;
20        Ok(status == 0 && !stdout.trim().is_empty())
21    }
22
23    fn install(&self, runner: &dyn Runner, packages: &[String]) -> Result<(), PackageError> {
24        let mut args = vec!["install"];
25        let pkg_refs: Vec<&str> = packages.iter().map(String::as_str).collect();
26        args.extend_from_slice(&pkg_refs);
27        let RunOutcome { status, stderr, .. } = runner.run("brew", &args)?;
28        if status != 0 {
29            return Err(PackageError::ExitFailure { status, stderr });
30        }
31        Ok(())
32    }
33}