use thiserror::Error;
pub type CompressionResult<T> = Result<T, CompressionError>;
#[derive(Error, Debug)]
pub enum CompressionError {
#[error("compression failed: {0}")]
CompressionFailed(String),
#[error("decompression failed: {0}")]
DecompressionFailed(String),
#[error("invalid input: {0}")]
InvalidInput(String),
#[error("unsupported algorithm: {0}")]
UnsupportedAlgorithm(String),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("zstd error: {0}")]
ZstdError(String),
#[error("brotli error: {0}")]
BrotliError(String),
#[error(transparent)]
Other(#[from] anyhow::Error),
}
impl CompressionError {
pub fn compression_failed<S: Into<String>>(msg: S) -> Self {
CompressionError::CompressionFailed(msg.into())
}
pub fn decompression_failed<S: Into<String>>(msg: S) -> Self {
CompressionError::DecompressionFailed(msg.into())
}
pub fn invalid_input<S: Into<String>>(msg: S) -> Self {
CompressionError::InvalidInput(msg.into())
}
pub fn unsupported_algorithm<S: Into<String>>(algorithm: S) -> Self {
CompressionError::UnsupportedAlgorithm(algorithm.into())
}
pub fn zstd_error<S: Into<String>>(msg: S) -> Self {
CompressionError::ZstdError(msg.into())
}
pub fn brotli_error<S: Into<String>>(msg: S) -> Self {
CompressionError::BrotliError(msg.into())
}
pub fn is_compression_failed(&self) -> bool {
matches!(self, CompressionError::CompressionFailed(_))
}
pub fn is_decompression_failed(&self) -> bool {
matches!(self, CompressionError::DecompressionFailed(_))
}
pub fn is_io(&self) -> bool {
matches!(self, CompressionError::Io(_))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_compression_error_creation() {
let err = CompressionError::compression_failed("test compression");
assert!(err.is_compression_failed());
assert_eq!(err.to_string(), "compression failed: test compression");
}
#[test]
fn test_decompression_error_creation() {
let err = CompressionError::decompression_failed("test decompression");
assert!(err.is_decompression_failed());
assert_eq!(err.to_string(), "decompression failed: test decompression");
}
#[test]
fn test_invalid_input_error() {
let err = CompressionError::invalid_input("empty data");
assert_eq!(err.to_string(), "invalid input: empty data");
}
#[test]
fn test_unsupported_algorithm_error() {
let err = CompressionError::unsupported_algorithm("gzip");
assert_eq!(err.to_string(), "unsupported algorithm: gzip");
}
#[test]
fn test_io_error_conversion() {
let io_err = std::io::Error::other("read failed");
let comp_err = CompressionError::from(io_err);
assert!(comp_err.is_io());
}
}