use crate::{config::pkg::InstallHint, error::Error};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DetectedPackageManager {
Brew,
}
impl DetectedPackageManager {
pub fn name(self) -> &'static str {
match self {
Self::Brew => "brew",
}
}
pub fn packages_for(self, hint: &InstallHint) -> &[String] {
match self {
Self::Brew => &hint.brew.packages,
}
}
pub fn install_command(self, packages: &[String]) -> String {
match self {
Self::Brew => format!("brew install {}", packages.join(" ")),
}
}
}
pub fn detect() -> Result<Option<DetectedPackageManager>, Error> {
if crate::utils::which::exists("brew")? {
return Ok(Some(DetectedPackageManager::Brew));
}
Ok(None)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::config::pkg::BrewHint;
#[test]
fn packages_for_brew_returns_packages_list() {
let hint = InstallHint {
brew: BrewHint {
packages: vec!["sk".into(), "fd".into()],
},
};
assert_eq!(
DetectedPackageManager::Brew.packages_for(&hint),
["sk", "fd"]
);
}
#[test]
fn packages_for_empty_returns_empty_slice() {
let hint = InstallHint::default();
assert!(DetectedPackageManager::Brew.packages_for(&hint).is_empty());
}
#[test]
fn install_command_joins_packages_with_spaces() {
let pkgs = vec!["sk".into(), "starship".into()];
assert_eq!(
DetectedPackageManager::Brew.install_command(&pkgs),
"brew install sk starship"
);
}
}