Skip to main content

scirs2_datasets/
error.rs

1//! Error types for the datasets module
2
3use std::io;
4use thiserror::Error;
5
6/// Error type for datasets operations
7#[derive(Error, Debug)]
8pub enum DatasetsError {
9    /// Invalid data format
10    #[error("Invalid format: {0}")]
11    InvalidFormat(String),
12
13    /// Data loading error
14    #[error("Loading error: {0}")]
15    LoadingError(String),
16
17    /// Format error
18    #[error("Format error: {0}")]
19    FormatError(String),
20
21    /// Not found error
22    #[error("Not found: {0}")]
23    NotFound(String),
24
25    /// Authentication error
26    #[error("Authentication error: {0}")]
27    AuthenticationError(String),
28
29    /// Download error
30    #[error("Download error: {0}")]
31    DownloadError(String),
32
33    /// Cache error
34    #[error("Cache error: {0}")]
35    CacheError(String),
36
37    /// IO error
38    #[error("IO error: {0}")]
39    IoError(#[from] io::Error),
40
41    /// Serialization/Deserialization error
42    #[error("Serialization error: {0}")]
43    SerdeError(String),
44
45    /// GPU acceleration error
46    #[error("GPU error: {0}")]
47    GpuError(String),
48
49    /// Computation error
50    #[error("Computation error: {0}")]
51    ComputationError(String),
52
53    /// Validation error
54    #[error("Validation error: {0}")]
55    ValidationError(String),
56
57    /// Processing error
58    #[error("Processing error: {0}")]
59    ProcessingError(String),
60
61    /// Other error
62    #[error("Error: {0}")]
63    Other(String),
64}
65
66impl PartialEq for DatasetsError {
67    fn eq(&self, other: &Self) -> bool {
68        match (self, other) {
69            (DatasetsError::InvalidFormat(a), DatasetsError::InvalidFormat(b)) => a == b,
70            (DatasetsError::LoadingError(a), DatasetsError::LoadingError(b)) => a == b,
71            (DatasetsError::FormatError(a), DatasetsError::FormatError(b)) => a == b,
72            (DatasetsError::NotFound(a), DatasetsError::NotFound(b)) => a == b,
73            (DatasetsError::AuthenticationError(a), DatasetsError::AuthenticationError(b)) => {
74                a == b
75            }
76            (DatasetsError::DownloadError(a), DatasetsError::DownloadError(b)) => a == b,
77            (DatasetsError::CacheError(a), DatasetsError::CacheError(b)) => a == b,
78            (DatasetsError::IoError(a), DatasetsError::IoError(b)) => {
79                // Compare io::Error by kind and message
80                a.kind() == b.kind() && a.to_string() == b.to_string()
81            }
82            (DatasetsError::SerdeError(a), DatasetsError::SerdeError(b)) => a == b,
83            (DatasetsError::GpuError(a), DatasetsError::GpuError(b)) => a == b,
84            (DatasetsError::ComputationError(a), DatasetsError::ComputationError(b)) => a == b,
85            (DatasetsError::ValidationError(a), DatasetsError::ValidationError(b)) => a == b,
86            (DatasetsError::ProcessingError(a), DatasetsError::ProcessingError(b)) => a == b,
87            (DatasetsError::Other(a), DatasetsError::Other(b)) => a == b,
88            _ => false,
89        }
90    }
91}
92
93/// Result type for datasets operations
94pub type Result<T> = std::result::Result<T, DatasetsError>;
95
96#[cfg(test)]
97mod tests {
98    use super::*;
99    use std::io;
100
101    #[test]
102    fn test_invalid_format_error() {
103        let error = DatasetsError::InvalidFormat("test format".to_string());
104        assert_eq!(error.to_string(), "Invalid format: test format");
105    }
106
107    #[test]
108    fn test_loading_error() {
109        let error = DatasetsError::LoadingError("test loading".to_string());
110        assert_eq!(error.to_string(), "Loading error: test loading");
111    }
112
113    #[test]
114    fn test_download_error() {
115        let error = DatasetsError::DownloadError("test download".to_string());
116        assert_eq!(error.to_string(), "Download error: test download");
117    }
118
119    #[test]
120    fn test_cache_error() {
121        let error = DatasetsError::CacheError("test cache".to_string());
122        assert_eq!(error.to_string(), "Cache error: test cache");
123    }
124
125    #[test]
126    fn test_io_error_conversion() {
127        let io_error = io::Error::new(io::ErrorKind::NotFound, "file not found");
128        let datasets_error: DatasetsError = io_error.into();
129
130        match datasets_error {
131            DatasetsError::IoError(_) => {
132                assert!(datasets_error.to_string().contains("file not found"));
133            }
134            _ => panic!("Expected IoError variant"),
135        }
136    }
137
138    #[test]
139    fn test_serde_error() {
140        let error = DatasetsError::SerdeError("serialization failed".to_string());
141        assert_eq!(
142            error.to_string(),
143            "Serialization error: serialization failed"
144        );
145    }
146
147    #[test]
148    fn test_gpu_error() {
149        let error = DatasetsError::GpuError("CUDA initialization failed".to_string());
150        assert_eq!(error.to_string(), "GPU error: CUDA initialization failed");
151    }
152
153    #[test]
154    fn test_other_error() {
155        let error = DatasetsError::Other("generic error".to_string());
156        assert_eq!(error.to_string(), "Error: generic error");
157    }
158
159    #[test]
160    fn test_error_debug_format() {
161        let error = DatasetsError::InvalidFormat("debug test".to_string());
162        let debug_str = format!("{error:?}");
163        assert!(debug_str.contains("InvalidFormat"));
164        assert!(debug_str.contains("debug test"));
165    }
166
167    #[test]
168    fn test_result_type() {
169        // Test Ok case
170        let ok_result: Result<i32> = Ok(42);
171        assert_eq!(ok_result, Ok(42));
172
173        // Test Err case
174        let err_result: Result<i32> = Err(DatasetsError::Other("test".to_string()));
175        assert!(err_result.is_err());
176    }
177
178    #[test]
179    fn test_error_from_io_error() {
180        let io_err = io::Error::new(io::ErrorKind::PermissionDenied, "access denied");
181        let datasets_err = DatasetsError::from(io_err);
182
183        if let DatasetsError::IoError(ref inner) = datasets_err {
184            assert_eq!(inner.kind(), io::ErrorKind::PermissionDenied);
185        } else {
186            panic!("Expected IoError variant");
187        }
188    }
189
190    #[test]
191    fn test_error_chain() {
192        // Test that error displays work correctly in error chains
193        let error = DatasetsError::LoadingError("failed to parse CSV".to_string());
194        let result: Result<()> = Err(error);
195
196        match result {
197            Ok(_) => panic!("Expected error"),
198            Err(e) => {
199                assert_eq!(e.to_string(), "Loading error: failed to parse CSV");
200            }
201        }
202    }
203}