use simple_spawn_blocking::Cancelled;
use std::{collections::HashMap, path::PathBuf};
use crate::{
install::{
clobber_registry::{ClobberError, ClobberedPath},
driver::PostProcessingError,
link_script::PrePostLinkError,
unlink::UnlinkError,
InstallError, TransactionError,
},
package_cache::PackageCacheError,
};
#[derive(Debug, thiserror::Error)]
pub enum InstallerError {
#[error("failed to determine the currently installed packages")]
FailedToDetectInstalledPackages(#[source] std::io::Error),
#[error("failed to construct a transaction")]
FailedToConstructTransaction(#[from] TransactionError),
#[error("failed to fetch {0}")]
FailedToFetch(String, #[source] PackageCacheError),
#[error("failed to link {0}")]
LinkError(String, #[source] InstallError),
#[error("failed to unlink {0}")]
UnlinkError(String, #[source] UnlinkError),
#[error("{0}")]
IoError(String, #[source] std::io::Error),
#[error("pre-processing failed")]
PreProcessingFailed(#[source] PrePostLinkError),
#[error("post-processing failed")]
PostProcessingFailed(#[source] PrePostLinkError),
#[error("failed to unclobber clobbered files")]
ClobberError(#[from] ClobberError),
#[error("{} file(s) are provided by multiple packages", .0.len())]
ClobberingDetected(HashMap<PathBuf, ClobberedPath>),
#[error("the operation was cancelled")]
Cancelled,
#[error("failed to create the prefix")]
FailedToCreatePrefix(PathBuf, #[source] std::io::Error),
#[error("cannot install platform-specific packages with noarch as the target platform. The following packages have non-noarch subdirs: {}", .0.join(", "))]
PlatformSpecificPackagesWithNoarchPlatform(Vec<String>),
#[error("failed to acquire global cache lock")]
FailedToAcquireCacheLock(#[source] PackageCacheError),
}
impl From<Cancelled> for InstallerError {
fn from(_: Cancelled) -> Self {
InstallerError::Cancelled
}
}
impl From<PostProcessingError> for InstallerError {
fn from(value: PostProcessingError) -> Self {
match value {
PostProcessingError::ClobberError(err) => InstallerError::ClobberError(err),
PostProcessingError::FailedToDetectInstalledPackages(err) => {
InstallerError::FailedToDetectInstalledPackages(err)
}
PostProcessingError::ClobberingDetected(paths) => {
InstallerError::ClobberingDetected(paths)
}
}
}
}