use crate::errors::Result;
use crate::output::{Printer, Role};
use crate::providers::PackageAction;
impl<'a> super::Reconciler<'a> {
pub(super) fn apply_package_action(
&self,
action: &PackageAction,
printer: &Printer,
) -> Result<String> {
match action {
PackageAction::Bootstrap { manager, .. } => {
for pm in &self.registry.package_managers {
if pm.name() == manager {
pm.bootstrap(printer)?;
if !pm.is_available() {
return Err(crate::errors::PackageError::BootstrapFailed {
manager: manager.clone(),
message: format!("{} still not available after bootstrap", manager),
}
.into());
}
return Ok(format!("package:{}:bootstrap", manager));
}
}
Err(crate::errors::PackageError::ManagerNotFound {
manager: manager.clone(),
}
.into())
}
PackageAction::Install {
manager, packages, ..
} => {
for pm in self.registry.available_package_managers() {
if pm.name() == manager {
pm.install(packages, printer)?;
return Ok(format!(
"package:{}:install:{}",
manager,
packages.join(",")
));
}
}
Err(crate::errors::PackageError::ManagerNotFound {
manager: manager.clone(),
}
.into())
}
PackageAction::Uninstall {
manager, packages, ..
} => {
for pm in self.registry.available_package_managers() {
if pm.name() == manager {
pm.uninstall(packages, printer)?;
return Ok(format!(
"package:{}:uninstall:{}",
manager,
packages.join(",")
));
}
}
Err(crate::errors::PackageError::ManagerNotFound {
manager: manager.clone(),
}
.into())
}
PackageAction::Skip {
manager, reason, ..
} => {
printer.status_simple(Role::Warn, format!("{}: {}", manager, reason));
Ok(format!("package:{}:skip", manager))
}
}
}
}