951a522
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<S3Error> for StorageError {
fn from(err: S3Error) -> Self {
StorageError::S3(err)
}
}
impl From<std::io::Error> for StorageError {
fn from(err: std::io::Error) -> Self {
StorageError::Io(err)
}
}
impl From<CredentialsError> for StorageError {
fn from(err: CredentialsError) -> Self {
StorageError::S3(S3Error::Credentials(err))
}
}