use miette::IntoDiagnostic;
use crate::{command, ok};
pub async fn check_if_package_is_installed(package_name: &str) -> miette::Result<bool> {
let output = command!(
program => "dpkg-query",
args => "-s", package_name
)
.output()
.await
.into_diagnostic()?;
ok!(output.status.success())
}
pub async fn install_package(package_name: &str) -> miette::Result<()> {
let command = command!(
program => "sudo",
args => "apt", "install", "-y", package_name
)
.output()
.await
.into_diagnostic()?;
if command.status.success() {
ok!()
} else {
miette::bail!(
"Failed to install package: {:?} with sudo apt",
String::from_utf8_lossy(&command.stderr)
);
}
}
#[cfg(test)]
mod tests_apt_install {
use super::*;
use crate::{return_if_not_interactive_terminal, TTYResult};
#[tokio::test]
async fn test_check_if_package_is_installed() {
return_if_not_interactive_terminal!();
let package_name = "bash";
let is_installed = check_if_package_is_installed(package_name).await.unwrap();
assert!(is_installed);
}
#[tokio::test]
async fn test_install_package() {
return_if_not_interactive_terminal!();
let package_name = "does_not_exist";
assert!(install_package(package_name).await.is_err());
}
}