use rusoto_core::{request::TlsError, HttpDispatchError, RusotoError};
use rusoto_s3::{
CompleteMultipartUploadError, CreateBucketError, CreateMultipartUploadError, GetObjectError,
ListObjectsV2Error, PutObjectError, UploadPartError,
};
use std::io::Error as IoError;
use thiserror::Error;
pub type S3ExtResult<T> = Result<T, S3ExtError>;
#[derive(Debug, Error)]
pub enum S3ExtError {
#[error("Unknown error {0}")]
Other(&'static str),
#[error("I/O Error {0}")]
IoError(#[from] IoError),
#[error("Rusoto CompleteMultipartUploadError {0}")]
CompleteMultipartUploadError(#[from] RusotoError<CompleteMultipartUploadError>),
#[error("Rusoto CreateMultipartUploadError {0}")]
CreateMultipartUploadError(#[from] RusotoError<CreateMultipartUploadError>),
#[error("Rusoto GetObjectError {0}")]
GetObjectError(#[from] RusotoError<GetObjectError>),
#[error("Rusoto HttpDispatchError {0}")]
HttpDispatchError(#[from] RusotoError<HttpDispatchError>),
#[error("Rusoto ListObjectV2Error {0}")]
ListObjectV2Error(#[from] RusotoError<ListObjectsV2Error>),
#[error("Rusoto PutObjectError {0}")]
PutObjectError(#[from] RusotoError<PutObjectError>),
#[error("Rusoto UploadPartError {0}")]
UploadPartError(#[from] RusotoError<UploadPartError>),
#[error("Rusoto CreateBucketError {0}")]
CreateBucketError(#[from] RusotoError<CreateBucketError>),
#[error("Rusoto TlsError {0}")]
TlsError(#[from] TlsError),
}