scirs2_io/
error.rs

1//! Error types for the IO module
2
3use std::error::Error;
4use std::fmt;
5
6/// Error type for IO operations
7#[derive(Debug)]
8pub enum IoError {
9    /// File error
10    FileError(String),
11    /// Format error
12    FormatError(String),
13    /// Serialization error
14    SerializationError(String),
15    /// Deserialization error
16    DeserializationError(String),
17    /// Compression error
18    CompressionError(String),
19    /// Decompression error
20    DecompressionError(String),
21    /// Unsupported compression algorithm
22    UnsupportedCompressionAlgorithm(String),
23    /// Unsupported format
24    UnsupportedFormat(String),
25    /// Conversion error
26    ConversionError(String),
27    /// File not found
28    FileNotFound(String),
29    /// Record/resource not found
30    NotFound(String),
31    /// Parse error
32    ParseError(String),
33    /// Standard I/O error
34    Io(std::io::Error),
35    /// Validation error
36    ValidationError(String),
37    /// Checksum error
38    ChecksumError(String),
39    /// Integrity error
40    IntegrityError(String),
41    /// Configuration error
42    ConfigError(String),
43    /// Network error
44    NetworkError(String),
45    /// Parquet error
46    ParquetError(String),
47    /// Database error
48    DatabaseError(String),
49    /// Timeout error
50    TimeoutError(String),
51    /// Other error
52    Other(String),
53}
54
55impl fmt::Display for IoError {
56    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
57        match self {
58            IoError::FileError(msg) => write!(f, "File error: {msg}"),
59            IoError::FormatError(msg) => write!(f, "Format error: {msg}"),
60            IoError::SerializationError(msg) => write!(f, "Serialization error: {msg}"),
61            IoError::DeserializationError(msg) => write!(f, "Deserialization error: {msg}"),
62            IoError::CompressionError(msg) => write!(f, "Compression error: {msg}"),
63            IoError::DecompressionError(msg) => write!(f, "Decompression error: {msg}"),
64            IoError::UnsupportedCompressionAlgorithm(algo) => {
65                write!(f, "Unsupported compression algorithm: {algo}")
66            }
67            IoError::UnsupportedFormat(fmt) => write!(f, "Unsupported format: {fmt}"),
68            IoError::ConversionError(msg) => write!(f, "Conversion error: {msg}"),
69            IoError::FileNotFound(path) => write!(f, "File not found: {path}"),
70            IoError::NotFound(msg) => write!(f, "Not found: {msg}"),
71            IoError::ParseError(msg) => write!(f, "Parse error: {msg}"),
72            IoError::Io(e) => write!(f, "I/O error: {e}"),
73            IoError::ValidationError(msg) => write!(f, "Validation error: {msg}"),
74            IoError::ChecksumError(msg) => write!(f, "Checksum error: {msg}"),
75            IoError::IntegrityError(msg) => write!(f, "Integrity error: {msg}"),
76            IoError::ConfigError(msg) => write!(f, "Configuration error: {msg}"),
77            IoError::NetworkError(msg) => write!(f, "Network error: {msg}"),
78            IoError::ParquetError(msg) => write!(f, "Parquet error: {msg}"),
79            IoError::DatabaseError(msg) => write!(f, "Database error: {msg}"),
80            IoError::TimeoutError(msg) => write!(f, "Timeout error: {msg}"),
81            IoError::Other(msg) => write!(f, "Error: {msg}"),
82        }
83    }
84}
85
86impl Error for IoError {}
87
88impl Clone for IoError {
89    fn clone(&self) -> Self {
90        match self {
91            IoError::FileError(msg) => IoError::FileError(msg.clone()),
92            IoError::FormatError(msg) => IoError::FormatError(msg.clone()),
93            IoError::SerializationError(msg) => IoError::SerializationError(msg.clone()),
94            IoError::DeserializationError(msg) => IoError::DeserializationError(msg.clone()),
95            IoError::CompressionError(msg) => IoError::CompressionError(msg.clone()),
96            IoError::DecompressionError(msg) => IoError::DecompressionError(msg.clone()),
97            IoError::UnsupportedCompressionAlgorithm(algo) => {
98                IoError::UnsupportedCompressionAlgorithm(algo.clone())
99            }
100            IoError::UnsupportedFormat(fmt) => IoError::UnsupportedFormat(fmt.clone()),
101            IoError::ConversionError(msg) => IoError::ConversionError(msg.clone()),
102            IoError::FileNotFound(path) => IoError::FileNotFound(path.clone()),
103            IoError::NotFound(msg) => IoError::NotFound(msg.clone()),
104            IoError::ParseError(msg) => IoError::ParseError(msg.clone()),
105            IoError::Io(e) => IoError::Io(std::io::Error::new(e.kind(), e.to_string())),
106            IoError::ValidationError(msg) => IoError::ValidationError(msg.clone()),
107            IoError::ChecksumError(msg) => IoError::ChecksumError(msg.clone()),
108            IoError::IntegrityError(msg) => IoError::IntegrityError(msg.clone()),
109            IoError::ConfigError(msg) => IoError::ConfigError(msg.clone()),
110            IoError::NetworkError(msg) => IoError::NetworkError(msg.clone()),
111            IoError::ParquetError(msg) => IoError::ParquetError(msg.clone()),
112            IoError::DatabaseError(msg) => IoError::DatabaseError(msg.clone()),
113            IoError::TimeoutError(msg) => IoError::TimeoutError(msg.clone()),
114            IoError::Other(msg) => IoError::Other(msg.clone()),
115        }
116    }
117}
118
119impl From<std::io::Error> for IoError {
120    fn from(err: std::io::Error) -> Self {
121        IoError::Io(err)
122    }
123}
124
125impl PartialEq for IoError {
126    fn eq(&self, other: &Self) -> bool {
127        match (self, other) {
128            (IoError::FileError(a), IoError::FileError(b)) => a == b,
129            (IoError::FormatError(a), IoError::FormatError(b)) => a == b,
130            (IoError::SerializationError(a), IoError::SerializationError(b)) => a == b,
131            (IoError::DeserializationError(a), IoError::DeserializationError(b)) => a == b,
132            (IoError::CompressionError(a), IoError::CompressionError(b)) => a == b,
133            (IoError::DecompressionError(a), IoError::DecompressionError(b)) => a == b,
134            (
135                IoError::UnsupportedCompressionAlgorithm(a),
136                IoError::UnsupportedCompressionAlgorithm(b),
137            ) => a == b,
138            (IoError::UnsupportedFormat(a), IoError::UnsupportedFormat(b)) => a == b,
139            (IoError::ConversionError(a), IoError::ConversionError(b)) => a == b,
140            (IoError::FileNotFound(a), IoError::FileNotFound(b)) => a == b,
141            (IoError::NotFound(a), IoError::NotFound(b)) => a == b,
142            (IoError::ParseError(a), IoError::ParseError(b)) => a == b,
143            (IoError::Io(a), IoError::Io(b)) => {
144                a.kind() == b.kind() && a.to_string() == b.to_string()
145            }
146            (IoError::ValidationError(a), IoError::ValidationError(b)) => a == b,
147            (IoError::ChecksumError(a), IoError::ChecksumError(b)) => a == b,
148            (IoError::IntegrityError(a), IoError::IntegrityError(b)) => a == b,
149            (IoError::ConfigError(a), IoError::ConfigError(b)) => a == b,
150            (IoError::NetworkError(a), IoError::NetworkError(b)) => a == b,
151            (IoError::ParquetError(a), IoError::ParquetError(b)) => a == b,
152            (IoError::DatabaseError(a), IoError::DatabaseError(b)) => a == b,
153            (IoError::TimeoutError(a), IoError::TimeoutError(b)) => a == b,
154            (IoError::Other(a), IoError::Other(b)) => a == b,
155            _ => false,
156        }
157    }
158}
159
160impl Eq for IoError {}
161
162impl PartialOrd for IoError {
163    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
164        Some(self.cmp(other))
165    }
166}
167
168impl Ord for IoError {
169    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
170        use std::cmp::Ordering;
171
172        // Compare variants first by their order in the enum
173        match (self, other) {
174            // Same variants, compare contents
175            (IoError::FileError(a), IoError::FileError(b)) => a.cmp(b),
176            (IoError::FormatError(a), IoError::FormatError(b)) => a.cmp(b),
177            (IoError::SerializationError(a), IoError::SerializationError(b)) => a.cmp(b),
178            (IoError::DeserializationError(a), IoError::DeserializationError(b)) => a.cmp(b),
179            (IoError::CompressionError(a), IoError::CompressionError(b)) => a.cmp(b),
180            (IoError::DecompressionError(a), IoError::DecompressionError(b)) => a.cmp(b),
181            (
182                IoError::UnsupportedCompressionAlgorithm(a),
183                IoError::UnsupportedCompressionAlgorithm(b),
184            ) => a.cmp(b),
185            (IoError::UnsupportedFormat(a), IoError::UnsupportedFormat(b)) => a.cmp(b),
186            (IoError::ConversionError(a), IoError::ConversionError(b)) => a.cmp(b),
187            (IoError::FileNotFound(a), IoError::FileNotFound(b)) => a.cmp(b),
188            (IoError::NotFound(a), IoError::NotFound(b)) => a.cmp(b),
189            (IoError::ParseError(a), IoError::ParseError(b)) => a.cmp(b),
190            (IoError::Io(a), IoError::Io(b)) => {
191                // Compare by kind first, then by string representation
192                match (a.kind() as u8).cmp(&(b.kind() as u8)) {
193                    Ordering::Equal => a.to_string().cmp(&b.to_string()),
194                    other => other,
195                }
196            }
197            (IoError::ValidationError(a), IoError::ValidationError(b)) => a.cmp(b),
198            (IoError::ChecksumError(a), IoError::ChecksumError(b)) => a.cmp(b),
199            (IoError::IntegrityError(a), IoError::IntegrityError(b)) => a.cmp(b),
200            (IoError::ConfigError(a), IoError::ConfigError(b)) => a.cmp(b),
201            (IoError::NetworkError(a), IoError::NetworkError(b)) => a.cmp(b),
202            (IoError::ParquetError(a), IoError::ParquetError(b)) => a.cmp(b),
203            (IoError::DatabaseError(a), IoError::DatabaseError(b)) => a.cmp(b),
204            (IoError::TimeoutError(a), IoError::TimeoutError(b)) => a.cmp(b),
205            (IoError::Other(a), IoError::Other(b)) => a.cmp(b),
206
207            // Different variants, order by enum variant position
208            (IoError::FileError(_), _) => Ordering::Less,
209            (_, IoError::FileError(_)) => Ordering::Greater,
210            (IoError::FormatError(_), _) => Ordering::Less,
211            (_, IoError::FormatError(_)) => Ordering::Greater,
212            (IoError::SerializationError(_), _) => Ordering::Less,
213            (_, IoError::SerializationError(_)) => Ordering::Greater,
214            (IoError::DeserializationError(_), _) => Ordering::Less,
215            (_, IoError::DeserializationError(_)) => Ordering::Greater,
216            (IoError::CompressionError(_), _) => Ordering::Less,
217            (_, IoError::CompressionError(_)) => Ordering::Greater,
218            (IoError::DecompressionError(_), _) => Ordering::Less,
219            (_, IoError::DecompressionError(_)) => Ordering::Greater,
220            (IoError::UnsupportedCompressionAlgorithm(_), _) => Ordering::Less,
221            (_, IoError::UnsupportedCompressionAlgorithm(_)) => Ordering::Greater,
222            (IoError::UnsupportedFormat(_), _) => Ordering::Less,
223            (_, IoError::UnsupportedFormat(_)) => Ordering::Greater,
224            (IoError::ConversionError(_), _) => Ordering::Less,
225            (_, IoError::ConversionError(_)) => Ordering::Greater,
226            (IoError::FileNotFound(_), _) => Ordering::Less,
227            (_, IoError::FileNotFound(_)) => Ordering::Greater,
228            (IoError::NotFound(_), _) => Ordering::Less,
229            (_, IoError::NotFound(_)) => Ordering::Greater,
230            (IoError::ParseError(_), _) => Ordering::Less,
231            (_, IoError::ParseError(_)) => Ordering::Greater,
232            (IoError::Io(_), _) => Ordering::Less,
233            (_, IoError::Io(_)) => Ordering::Greater,
234            (IoError::ValidationError(_), _) => Ordering::Less,
235            (_, IoError::ValidationError(_)) => Ordering::Greater,
236            (IoError::ChecksumError(_), _) => Ordering::Less,
237            (_, IoError::ChecksumError(_)) => Ordering::Greater,
238            (IoError::IntegrityError(_), _) => Ordering::Less,
239            (_, IoError::IntegrityError(_)) => Ordering::Greater,
240            (IoError::ConfigError(_), _) => Ordering::Less,
241            (_, IoError::ConfigError(_)) => Ordering::Greater,
242            (IoError::NetworkError(_), _) => Ordering::Less,
243            (_, IoError::NetworkError(_)) => Ordering::Greater,
244            (IoError::ParquetError(_), _) => Ordering::Less,
245            (_, IoError::ParquetError(_)) => Ordering::Greater,
246            (IoError::DatabaseError(_), _) => Ordering::Less,
247            (_, IoError::DatabaseError(_)) => Ordering::Greater,
248            (IoError::TimeoutError(_), _) => Ordering::Less,
249            (_, IoError::TimeoutError(_)) => Ordering::Greater,
250            // Other is last
251        }
252    }
253}
254
255/// Result type for IO operations
256pub type Result<T> = std::result::Result<T, IoError>;