use std::fmt; use s3::creds::error::CredentialsError; use s3::error::S3Error; #[derive(Debug)] pub enum StorageError { InvalidConfig(String), S3(S3Error), Io(std::io::Error), UnexpectedStatus { operation: &'static str, status: u16, }, } impl fmt::Display for StorageError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { StorageError::InvalidConfig(msg) => write!(f, "invalid s3 config: {msg}"), StorageError::S3(err) => write!(f, "s3 error: {err}"), StorageError::Io(err) => write!(f, "io error: {err}"), StorageError::UnexpectedStatus { operation, status } => { write!(f, "{operation} returned unexpected status {status}") } } } } impl std::error::Error for StorageError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { match self { StorageError::S3(err) => Some(err), StorageError::Io(err) => Some(err), _ => None, } } } impl From for StorageError { fn from(err: S3Error) -> Self { StorageError::S3(err) } } impl From for StorageError { fn from(err: std::io::Error) -> Self { StorageError::Io(err) } } impl From for StorageError { fn from(err: CredentialsError) -> Self { StorageError::S3(S3Error::Credentials(err)) } }