use thiserror::Error;
pub type Result<T> = std::result::Result<T, ArchiveError>;
#[derive(Error, Debug)]
pub enum ArchiveError {
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("Failed to decode {format} archive: {reason}")]
DecodeFailed {
format: String,
reason: String,
},
#[error("Failed to encode {format} archive: {reason}")]
EncodeFailed {
format: String,
reason: String,
},
#[error("Duplicate file paths detected: {}", .paths.join(", "))]
DuplicateFiles {
paths: Vec<String>,
},
#[error("Unsupported format: {0}")]
UnsupportedFormat(String),
#[error("Invalid archive structure: {0}")]
InvalidArchive(String),
#[error("Compression error: {0}")]
CompressionError(String),
#[error("Decompression error: {0}")]
DecompressionError(String),
}
impl ArchiveError {
pub fn io_context(error: std::io::Error, context: impl std::fmt::Display) -> Self {
ArchiveError::Io(std::io::Error::new(
error.kind(),
format!("{}: {}", context, error),
))
}
}