1use std::io;
4use thiserror::Error;
5
6#[derive(Error, Debug)]
8pub enum DatasetsError {
9 #[error("Invalid format: {0}")]
11 InvalidFormat(String),
12
13 #[error("Loading error: {0}")]
15 LoadingError(String),
16
17 #[error("Format error: {0}")]
19 FormatError(String),
20
21 #[error("Not found: {0}")]
23 NotFound(String),
24
25 #[error("Authentication error: {0}")]
27 AuthenticationError(String),
28
29 #[error("Download error: {0}")]
31 DownloadError(String),
32
33 #[error("Cache error: {0}")]
35 CacheError(String),
36
37 #[error("IO error: {0}")]
39 IoError(#[from] io::Error),
40
41 #[error("Serialization error: {0}")]
43 SerdeError(String),
44
45 #[error("GPU error: {0}")]
47 GpuError(String),
48
49 #[error("Computation error: {0}")]
51 ComputationError(String),
52
53 #[error("Validation error: {0}")]
55 ValidationError(String),
56
57 #[error("Processing error: {0}")]
59 ProcessingError(String),
60
61 #[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 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
93pub 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 let ok_result: Result<i32> = Ok(42);
171 assert_eq!(ok_result, Ok(42));
172
173 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 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}