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