#[derive(Debug, thiserror::Error)]
pub enum PkgError {
#[error("failed to parse manifest: {0}")]
ManifestParse(String),
#[error("invalid version: {0}")]
InvalidVersion(String),
#[error("dependency resolution failed: {0}")]
ResolutionFailed(String),
#[error("unresolvable dependency constraints:\n{}", format_conflicts(.0))]
UnresolvableConstraints(Vec<String>),
#[error("package not found: {0}")]
PackageNotFound(String),
#[error("I/O error: {0}")]
Io(String),
#[error("failed to parse lockfile: {0}")]
LockfileParse(String),
#[error("network error: {0}")]
Network(String),
#[error("checksum mismatch: expected {expected}, got {actual}")]
ChecksumMismatch {
expected: String,
actual: String,
},
}
fn format_conflicts(conflicts: &[String]) -> String {
conflicts
.iter()
.map(|c| format!(" - {c}"))
.collect::<Vec<_>>()
.join("\n")
}
pub type PkgResult<T> = Result<T, PkgError>;