Skip to main content

krypt_pkg/
winget.rs

1//! `winget` package manager implementation (Windows Package Manager).
2//!
3//! winget does not reliably accept multiple packages in one call, so each
4//! package is installed in a separate process invocation.
5
6use crate::manager::{PackageError, PackageManager, RunOutcome, Runner};
7
8/// Package manager implementation for Windows (winget).
9pub 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}