mediagit_compression/
error.rs1use thiserror::Error;
17
18pub type CompressionResult<T> = Result<T, CompressionError>;
20
21#[derive(Error, Debug)]
23pub enum CompressionError {
24 #[error("compression failed: {0}")]
26 CompressionFailed(String),
27
28 #[error("decompression failed: {0}")]
30 DecompressionFailed(String),
31
32 #[error("invalid input: {0}")]
34 InvalidInput(String),
35
36 #[error("unsupported algorithm: {0}")]
38 UnsupportedAlgorithm(String),
39
40 #[error("I/O error: {0}")]
42 Io(#[from] std::io::Error),
43
44 #[error("zstd error: {0}")]
46 ZstdError(String),
47
48 #[error("brotli error: {0}")]
50 BrotliError(String),
51
52 #[error(transparent)]
54 Other(#[from] anyhow::Error),
55}
56
57impl CompressionError {
58 pub fn compression_failed<S: Into<String>>(msg: S) -> Self {
60 CompressionError::CompressionFailed(msg.into())
61 }
62
63 pub fn decompression_failed<S: Into<String>>(msg: S) -> Self {
65 CompressionError::DecompressionFailed(msg.into())
66 }
67
68 pub fn invalid_input<S: Into<String>>(msg: S) -> Self {
70 CompressionError::InvalidInput(msg.into())
71 }
72
73 pub fn unsupported_algorithm<S: Into<String>>(algorithm: S) -> Self {
75 CompressionError::UnsupportedAlgorithm(algorithm.into())
76 }
77
78 pub fn zstd_error<S: Into<String>>(msg: S) -> Self {
80 CompressionError::ZstdError(msg.into())
81 }
82
83 pub fn brotli_error<S: Into<String>>(msg: S) -> Self {
85 CompressionError::BrotliError(msg.into())
86 }
87
88 pub fn is_compression_failed(&self) -> bool {
90 matches!(self, CompressionError::CompressionFailed(_))
91 }
92
93 pub fn is_decompression_failed(&self) -> bool {
95 matches!(self, CompressionError::DecompressionFailed(_))
96 }
97
98 pub fn is_io(&self) -> bool {
100 matches!(self, CompressionError::Io(_))
101 }
102}
103
104#[cfg(test)]
105mod tests {
106 use super::*;
107
108 #[test]
109 fn test_compression_error_creation() {
110 let err = CompressionError::compression_failed("test compression");
111 assert!(err.is_compression_failed());
112 assert_eq!(err.to_string(), "compression failed: test compression");
113 }
114
115 #[test]
116 fn test_decompression_error_creation() {
117 let err = CompressionError::decompression_failed("test decompression");
118 assert!(err.is_decompression_failed());
119 assert_eq!(err.to_string(), "decompression failed: test decompression");
120 }
121
122 #[test]
123 fn test_invalid_input_error() {
124 let err = CompressionError::invalid_input("empty data");
125 assert_eq!(err.to_string(), "invalid input: empty data");
126 }
127
128 #[test]
129 fn test_unsupported_algorithm_error() {
130 let err = CompressionError::unsupported_algorithm("gzip");
131 assert_eq!(err.to_string(), "unsupported algorithm: gzip");
132 }
133
134 #[test]
135 fn test_io_error_conversion() {
136 let io_err = std::io::Error::other("read failed");
137 let comp_err = CompressionError::from(io_err);
138 assert!(comp_err.is_io());
139 }
140}