htsget_storage/
error.rs

1//! Error and result types for htsget-storage.
2//!
3
4use htsget_config::types::HtsGetError;
5use std::io;
6use std::io::ErrorKind;
7use std::net::AddrParseError;
8use thiserror::Error;
9
10/// The result type for storage.
11pub type Result<T> = core::result::Result<T, StorageError>;
12
13/// Storage error type.
14#[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}