1use crate::manager::{PackageError, PackageManager, RunOutcome, Runner};
7
8pub struct Winget;
10
11impl PackageManager for Winget {
12 fn name(&self) -> &'static str {
13 "winget"
14 }
15
16 fn is_available(&self) -> bool {
17 which::which("winget").is_ok()
18 }
19
20 fn is_installed(&self, runner: &dyn Runner, pkg: &str) -> Result<bool, PackageError> {
21 let RunOutcome { status, stdout, .. } = runner.run("winget", &["list", "--id", pkg])?;
22 Ok(status == 0 && !stdout.trim().is_empty())
23 }
24
25 fn install(&self, runner: &dyn Runner, packages: &[String]) -> Result<(), PackageError> {
26 for pkg in packages {
27 let RunOutcome { status, stderr, .. } = runner.run(
28 "winget",
29 &[
30 "install",
31 "--silent",
32 "--accept-package-agreements",
33 "--accept-source-agreements",
34 pkg.as_str(),
35 ],
36 )?;
37 if status != 0 {
38 return Err(PackageError::ExitFailure { status, stderr });
39 }
40 }
41 Ok(())
42 }
43}