1use htsget_config::types::HtsGetError;
5use std::io;
6use std::io::ErrorKind;
7use std::net::AddrParseError;
8use thiserror::Error;
9
10pub type Result<T> = core::result::Result<T, StorageError>;
12
13#[derive(Error, Debug)]
15pub enum StorageError {
16 #[error("wrong key derived from ID: {0}")]
17 InvalidKey(String),
18
19 #[error("key not found in storage: {0}")]
20 KeyNotFound(String),
21
22 #[error("{0}: {1}")]
23 IoError(String, io::Error),
24
25 #[error("server error: {0}")]
26 ServerError(String),
27
28 #[error("invalid input: {0}")]
29 InvalidInput(String),
30
31 #[error("invalid uri: {0}")]
32 InvalidUri(String),
33
34 #[error("invalid address: {0}")]
35 InvalidAddress(AddrParseError),
36
37 #[error("unsupported format: {0}")]
38 UnsupportedFormat(String),
39
40 #[error("internal error: {0}")]
41 InternalError(String),
42
43 #[error("response error: {0}")]
44 ResponseError(String),
45
46 #[cfg(feature = "aws")]
47 #[error("aws error: {0}, with key: {1}")]
48 AwsS3Error(String, String),
49
50 #[error("parsing url: {0}")]
51 UrlParseError(String),
52}
53
54impl From<StorageError> for HtsGetError {
55 fn from(err: StorageError) -> Self {
56 match err {
57 err @ StorageError::InvalidInput(_) => Self::InvalidInput(err.to_string()),
58 err @ (StorageError::KeyNotFound(_)
59 | StorageError::InvalidKey(_)
60 | StorageError::ResponseError(_)) => Self::NotFound(err.to_string()),
61 err @ StorageError::IoError(_, _) => Self::IoError(err.to_string()),
62 err @ StorageError::UnsupportedFormat(_) => Self::UnsupportedFormat(err.to_string()),
63 err @ (StorageError::ServerError(_)
64 | StorageError::InvalidUri(_)
65 | StorageError::InvalidAddress(_)
66 | StorageError::InternalError(_)) => Self::InternalError(err.to_string()),
67 #[cfg(feature = "aws")]
68 err @ StorageError::AwsS3Error(_, _) => Self::IoError(err.to_string()),
69 err @ StorageError::UrlParseError(_) => Self::ParseError(err.to_string()),
70 }
71 }
72}
73
74impl From<StorageError> for io::Error {
75 fn from(err: StorageError) -> Self {
76 match err {
77 StorageError::IoError(_, ref io_error) => Self::new(io_error.kind(), err),
78 err => Self::new(ErrorKind::Other, err),
79 }
80 }
81}
82
83impl From<io::Error> for StorageError {
84 fn from(error: io::Error) -> Self {
85 Self::IoError("io error".to_string(), error)
86 }
87}
88
89#[cfg(test)]
90mod tests {
91 use super::*;
92 use htsget_config::types::HtsGetError;
93
94 #[test]
95 fn htsget_error_from_storage_not_found() {
96 let result = HtsGetError::from(StorageError::KeyNotFound("error".to_string()));
97 assert!(matches!(result, HtsGetError::NotFound(_)));
98 }
99
100 #[test]
101 fn htsget_error_from_storage_invalid_key() {
102 let result = HtsGetError::from(StorageError::InvalidKey("error".to_string()));
103 assert!(matches!(result, HtsGetError::NotFound(_)));
104 }
105}